软硬件 | 最低配置 | 推荐配置 |
---|---|---|
cpu和内存 | Master: 至少2核和4GB内存 | |
Node:至少4核和16GB内存 | Master: 4核和16GB内存 | |
Node: 应根据需要运行的容器数量进行配置 | ||
Docker | 1.9版本以上 | 1.12版本 |
etcd | 2.0版本以上 | 3.0版本 |
单个master节点,然后管理多个node节点
多个master节点,管理多个node节点,同时中间多了一个负载均衡的过程
以Centos7为例子,首先关闭防火墙
# 关闭防火墙 systemctl disable firewalld systemctl stop firewalld # 禁用SELinux,目的让容器可以读取主机文件系统 setenforce 0 # 或者修改系统文件/etc/sysconfig/selinux,将SELINUX=enforcing修改成将SELINUX=disable,然后重启Linux
yum install etcd –y vi /etc/etcd/etcd.conf ETCD_NAME="default" ETCD_DATA_DIR="/var/lib/etcd/default" ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379" ETCD_ADVERTISE_CLIENT_URLS=http://0.0.0.0:2379 systemctl enable etcd systemctl start etcd
etcd github地址:https://github.com/etcd-io/etcd/releases
下载etcd-v3.3.10-linux-amd64.tar.gz 版本
上传到服务器/usr/local/etcd 目录下且解压
# 解压 tar zxvf etcd-v3.3.10-linux-amd64.tar.gz # 解压后进入目录将etcd、etcdctl二进制文件复制到/usr/bin目录 cp etcd etcdctl /usr/bin/ # 在/etc/systemd/system/目录里创建etcd.service [Unit] Description=etcd.service [Service] Type=notify TimeoutStartSec=0 Restart=always WorkingDirectory=/var/lib/etcd EnvironmentFile=-/etc/etcd/etcd.conf ExecStart=/usr/bin/etcd [Install] WantedBy=multi-user.target #创建配置/etc/etcd/etcd.conf文件 ETCD_NAME=ETCD Server ETCD_DATA_DIR="/var/lib/etcd/" ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379" ETCD_ADVERTISE_CLIENT_URLS="http://本机IP:2379"
设置开机启动
systemctl daemon-reload systemctl enable etcd.service systemctl start etcd.service
查询是否自启动
systemctl is-enabled etcd.service
关闭开机自启服务
systemctl disable etcd.service
验证是否正确安装
etcdctl cluster-health
查看运行状态
systemctl status etcd.service
最简单的安装方法是使用yum install kubernetes 命令完成Kubernetes集群的安装,但仍需修改各组件的启动参数,才能完成Kubernetes 集群的配置。整个过程比较复杂,也容易出错,所以先使用基于kubeadm的安装过程。
安装钱准备
# 关闭防火墙 systemctl stop firewalld systemctl disable firewalld # 关闭selinux # 永久关闭 sed -i 's/enforcing/disabled/' /etc/selinux/config # 临时关闭 setenforce 0 # 关闭swap # 临时 swapoff -a # 永久关闭 sed -ri 's/.*swap.*/#&/' /etc/fstab # 根据规划设置主机名【master节点上操作】 hostnamectl set-hostname k8smaster # 根据规划设置主机名【node1节点操作】 hostnamectl set-hostname k8snode1 # 将桥接的IPv4流量传递到iptables的链 cat > /etc/sysctl.d/k8s.conf << EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF # 生效 sysctl --system # 时间同步 yum install ntpdate -y ntpdate time.windows.com
首先配置yum源,官方yum源的地址为https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64。如果无法访问官方yum源的地址,则也可以使用国内的一个yum源,地址为http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/,yum源的配置文件vi /etc/yum.repos.d/kubernetes.repo的内容如下:
[kubernetes]name=Kubernetes Respositorybaseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/enabled=1gpgcheck=0
然后运行yum install命令安装kubeadm和相关工具:
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
运行下面的命令,启动Docker服务(如果已安装Docker,则无须再次启动)和kubelet服务,并设置为开机自动启动:
systemctl enable docker && systemctl start dockersystemctl enable kubelet && systemctl start kubelet
kubeadm已经进入GA阶段,其控制面初始化和加入节点步骤都支持大量的可定制内容,因此kubeadm还提供了配置文件功能用于复杂定制。同时,kubeadm将配置文件以ConfigMap的形式保存到集群之中,便于后续的查询和升级工作。kubeadm config子命令提供了对这一组功能的支持:
例如,执行kubeadm config print init-defaults,可以取得默认的初始化参数文件:
kubeadm config print init-defaults > init-defaults.yaml
对生成的文件进行编辑,可以按需生成合适的配置。例如,若需要定制镜像仓库的地址,以及Pod的地址范围,则可以使用如下配置,保存为init-config.yaml:
apiVersion: kubeadm.k8s.io/v1beta2 kind: ClusterConfiguration imageRepository: registry.aliyuncs.com/google_containers kubernetesVersion: v1.18.0 networking: podSubnet: 10.100.0.0/16
为了从国内的镜像托管站点获得镜像加速支持,建议修改Docker的配置文件,增加RegistryMirror参数,将镜像配置写入配置参数中,例如echo ‘{“registry-mirrors”:[“https://registry.docker-cn.com”]}’ > /etc/docker/daemon.json,然后重启Docker服务。使用config images pull子命令下载所需镜像,例如:
kubeadm config images pull --config=init-config.yaml
在镜像下载完成之后,就可以进行安装了。
报错:
this version of kubeadm only supports deploying clusters with the control plane version >= 1.22.0. Current version: v1.18.0
报错内容可以看出书中提供的版本太老,不被当前kubeadm支持。
1、查看当前配置中需求的镜像
[root@localhost k8s]# kubeadm config images list k8s.gcr.io/kube-apiserver:v1.23.2 k8s.gcr.io/kube-controller-manager:v1.23.2 k8s.gcr.io/kube-scheduler:v1.23.2 k8s.gcr.io/kube-proxy:v1.23.2 k8s.gcr.io/pause:3.6 k8s.gcr.io/etcd:3.5.1-0 k8s.gcr.io/coredns/coredns:v1.8.6
2、修改init-config.yaml
apiVersion: kubeadm.k8s.io/v1beta2 kind: ClusterConfiguration imageRepository: registry.aliyuncs.com/google_containers kubernetesVersion: v1.23.2 networking: podSubnet: 10.100.0.0/16
至此,准备工作已就绪,执行kubeadm init命令即可一键安装Kubernetes的Master。接下来使用kubeadm init命令,使用前面创建的配置文件进行集群控制面的初始化:
kubeadm init --config=init-config.yaml
问题:
出现端口号被占用和/var/lib/etcd is not empty
#查看端口号 netstat -tupln #停止etcd服务 systemctl stop etcd #删除文件下的内容 rm -rf /var/lib/etcd #重启kubeadm kubeadm reset
再次kubeadm init --config=init-config.yaml报错。
cat > /etc/docker/daemon.json <<EOF { "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m" }, "storage-driver": "overlay2", "storage-opts": [ "overlay2.override_kernel_check=true" ] } EOF mkdir -p /etc/systemd/system/docker.service.d systemctl daemon-reload systemctl restart docker
再去kubeadm init。
Kubernetes的Master安装成功,显示如下信息
按照提示执行下面的命令,复制配置文件到普通用户的home目录下:
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
这样就在Master上安装了Kubernetes,但在集群内还是没有可用的工作Node,并缺乏对容器网络的配置。这里需要注意kubeadm init命令执行完成后的最后几行提示信息,其中包含加入节点的指令(kubeadm join)和所需的Token。
此时可以用kubectl命令验证在2.2.2节中提到的ConfigMap:
kubectl get -n kube-system configmap
下载并安装calico
如果我们使用kubectl get nodes会发现status状态为NotReady状态,这是因为我们还没有安装网络插件
wget https://docs.projectcalico.org/manifests/calico.yaml --no-check-certificate
更改calico.yaml,通过命令行:/ 搜索Cluster type to identify the deployment type
:/Cluster type to identify the deployment type
# Cluster type to identify the deployment type - name: CLUSTER_TYPE value: "k8s,bgp" # 下方熙增新增 - name: IP_AUTODETECTION_METHOD value: "interface=ens32" # ens32为本地网卡名字
应用配置:
kubectl apply -f calico.yaml
对于新节点的添加,系统准备和Kubernetes yum源的配置过程是一致的,在Node主机上执行下面的安装过程。
1、安装kubeadm和相关工具:
# 根据规划设置主机名【node1节点操作】 hostnamectl set-hostname k8snode1 #安装kubeadm和相关工具: yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
2、运行下面的命令启动Docker服务与kubelet服务,并将其设置为开机自启动:
systemctl enable docker && systemctl start dockersystemctl enable kubelet && systemctl start kubelet
3、执行kubeadm join 命令,将本Node加入集群:
kubeadm join 192.168.152.173:6443 --token ual2oe.gk2r3mbnc5hxwacz \ --discovery-token-ca-cert-hash sha256:e52bfd0a5551604e368b6ed50ce14f9afd4c3d1366277b6a790b4cfc933255c4
apiServerEndpoint的值来自Master服务器的地址,token和tlsBootstrapToken的值就来自于使用kubeadm init安装Master的最后一行提示信息。如果忘记了token信息和证书信息可使用以下命令查询:
[root@iZ2zeb4qsoj3p5ymi6ksehZ k8s]# kubeadm token list TOKEN TTL EXPIRES USAGES DESCRIPTION EXTRA GROUPS ex5byq.j1cy4zn75ufwytu2 23h 2022-01-22T08:32:10Z authentication,signing <none> system:bootstrappers:kubeadm:default-node-token
token 24小时失效可使用如下命令重新创建:
kubeadm token create
错误1:如果不加–discovery-token-ca-cert-hash 可能出现以下错误,说明需要进行ca校验可以使用–discovery-token-unsafe-skip-ca-verification参数忽略校验
discovery.bootstrapToken: Invalid value: "": using token-based discovery without caCertHashes can be unsafe. Set unsafeSkipCAVerification to continue
kubeadm join --token ex5byq.j1cy4zn75ufwytu2 39.107.14.61:6443 --discovery-token-unsafe-skip-ca-verification
错误2:
执行命令:
echo "1" >/proc/sys/net/bridge/bridge-nf-call-iptables
再次加入master节点
在master查看节点的状态
kubectl get nodes
执行下面的命令,验证Kubernetes集群的相关Pod是否都正常创建并运行:
kubectl get pods --all-namespaces
如果发现有状态错误的Pod,则可以执行kubectl --namespace=kube-system describe pod <pod_name>来查看错误原因,常见的错误原因是镜像没有下载完成。如果安装失败,则可以执行kubeadm reset命令将主机恢复原状,重新执行kubeadm init命令再次安装(注意在执行 kubeadm reset命令后需要执行rm -rf $HOME/.kube)
我们都知道K8S是容器化技术,它可以联网去下载镜像,用容器的方式进行启动
在Kubernetes集群中创建一个pod,验证是否正常运行:
# 下载nginx 【会联网拉取nginx镜像】 kubectl create deployment nginx --image=nginx # 查看状态 kubectl get pod
如果我们出现Running状态的时候,表示已经成功运行了
下面我们就需要将端口暴露出去,让其它外界能够访问
# 暴露端口kubectl expose deployment nginx --port=80 --type=NodePort# 查看一下对外的端口kubectl get pod,svc
能够看到,我们已经成功暴露了 80端口 到 30608上
我们到我们的宿主机浏览器上,访问如下地址
http://192.168.152.173:30608/
发现我们的nginx已经成功启动了