K8s实验环境:

一个manager,2个worker node的centos7,保证互相能够通信:
在这里插入图片描述

一、准备步骤:

步骤1.关闭三台设备selinux和设置防火墙

selinux需要将修改/etc/selinux/config文件,将SELINUX设置为disable;


# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of three two values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted

防火墙放行所有数据包:

[root@vms201 ~]# firewall-cmd --set-default-zone=trusted
Warning: ZONE_ALREADY_SET: trusted
success

步骤2.修改hosts文件,保证三台设备能够通过域名访问
vms201上:vim /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.0.201 vms201.rhce.cc vms201
192.168.0.202 vms202.rhce.cc vms202
192.168.0.203 vms203.rhce.cc vms203

同步给vms202和vms203:

scp /etc/hosts vms202:/etc/
scp /etc/hosts vms203:/etc/

步骤3:三台设备上关闭SWAP

swapoff -a ; sed -i '/swap/d' /etc/fstab

步骤4:三台设备配置yum源

wget ftp://ftp.rhce.cc/k8s/* -P /etc/yum.repos.d/

二、安装Docker,作为kubernetes的runtime:

步骤1:在三台设备上安装docker-ce版本,并启动

yum install docker-ce -y

systemctl enable docker --now

步骤2:设置镜像加速器,使用阿里云的即可

cat > /etc/docker/daemon.json <<EOF
{
  "registry-mirrors": ["https://xxxxxx.mirror.aliyuncs.com"]
}
EOF

systemctl restart docker

三、K8S安装:

步骤1:三台设备上设置iptables相关属性

cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF

步骤2:三台设备上安装K8s,并启动服务

yum install -y kubelet-1.21.0-0 kubeadm-1.21.0-0 kubectl-1.21.0-0 --disableexcludes=kubernetes

systemctl restart kubelet ; systemctl enable kubelet

K8S的版本命名,例如,版本号为x.y.z-0,其中x为大版本号,y为小版本号,z为补丁号。版本前面一般会加一个v,表示version。

通过如下命令可以查看有哪些版本的k8s

yum list --showduplicates kubeadm --disableexcludes=kubernetes

步骤3:在master上初始化集群

在master上的核心组件,例如api-server、scheduler、kubelet、etcd、scheduler等都是以容器的方式运行,由于默认的国外镜像站点可能无法访问,所以这里修改为阿里云镜像下载,同时需要指定版本和pod的网段地址:

kubeadm init --image-repository registry.aliyuncs.com/google_containers --kubernetes-version=v1.21.0 --pod-network-cidr=10.244.0.0/16

下载完成后后使用docker images查看下载的镜像。在下载过程中可能会出现报错信息提示镜像:
docker pull registry.aliyuncs.com/google_containers/coredns/coredns:v1.8.0
没有下载下来,这是由于阿里云命名错误 。

所以我们需要自己下载导入并同步到另外两台设备上去,并加载:

scp coredns-1.21.tar vms202:~
scp coredns-1.21.tar vms203:~
docker load -i coredns-1.21.tar 

导入镜像完成后重新初始化k8s:

kubeadm init --image-repository registry.aliyuncs.com/google_containers --kubernetes-version=v1.21.0 --pod-network-cidr=10.244.0.0/16

步骤4:在master上创建k8s认证文件

上一步初始化完成后会有提示信息,依次复制提信息中的三条命令即可:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

步骤5:两台worker noeds加入集群
在master上:

kubeadm  token create --print-join-command

将显示的内容复制到两台work nodes即可。在master上查看nodes:

[root@vms201 ~]# kubectl get nodes
NAME             STATUS      ROLES                  AGE    VERSION
vms201.rhce.cc   NotReady    control-plane,master   x      v1.21.0
vms202.rhce.cc   NotReady    <none>                 x      v1.21.0
vms203.rhce.cc   NotReady    <none>                 x      v1.21.0

可以看打vms202和vms203都加入到了集群中;但是STATUS是NotReady,原因是各个Pod之间无法通信,需要安装CNI网络插件。这里安装calico:

curl https://docs.projectcalico.org/manifests/calico-etcd.yaml -o calico.yaml

然后查看calico.yaml需要哪些镜像:

[root@vms201 ~]# grep image calico.yaml
          image: docker.io/calico/cni:v3.19.1
          image: docker.io/calico/pod2daemon-flexvol:v3.19.1
          image: docker.io/calico/node:v3.19.1
          image: docker.io/calico/kube-controllers:v3.19.1

然后再master上将所有所需镜像pull下来,并打包成tar文件拷贝到2个work nodes上,并在三台设备上导入回镜像:

docker save calico/cni  calico/kube-controllers calico/node calico/pod2daemon-flexvol >  calico-3.19-img.tar

scp calico-3.19-img.tar vms202:~
scp calico-3.19-img.tar vms203:~

docker load -i calico-3.19-img.tar

在三台设备上使用docker images查看加载是否成功。然后在master上修改calico.yaml文件,并安装:

vim calico.yaml

搜索192.168.0.0,修改为初始化集群时pod的10.244.0.0/24即可:

- name: CALICO_IPV4POOL_CIDR
  value: "10.244.0.0/16"

修改保存后在master设备上使用如下命令安装calico:

kubectl apply -f calico.yaml

安装完成后查看重新查看noeds状态:

[root@vms201 ~]# kubectl get nodes
NAME             STATUS   ROLES                  AGE    VERSION
vms201.rhce.cc   Ready    control-plane,master   2d8h   v1.21.0
vms202.rhce.cc   Ready    <none>                 2d8h   v1.21.0
vms203.rhce.cc   Ready    <none>                 2d8h   v1.21.0

可以看到STATUS为Ready。

步骤6:设置tab键补全k8s命令的功能

前提: bash-completion.noarch 必须要安装才行。

我们目前无法使用tab键补全命令,所以需要进行配置。在master上:

vim /etc/profile

加入一行配置:

# /etc/profile
source <(kubectl completion bash)

# System wide environment and startup programs, for login setup
# Functions and aliases go in /etc/bashrc

# It's NOT a good idea to change this file unless you know what you
# are doing. It's much better to create a custom.sh shell script in
# /etc/profile.d/ to make custom changes to your environment, as this
# will prevent the need for merging in future updates.

保存配置后更新配置

source /etc/profile

完成后即可使用tab键补全k8s相关命令。

四、重装K8s集群相关操作

步骤1:在master上删除nodes

kubectl drain vms202.rhce.cc --ignore-daemonsets
kubectl drain vms203.rhce.cc --ignore-daemonsets

kubectl delete nodes vms202.rhce.cc
kubectl delete nodes vms203.rhce.cc

kubectl drain vms201.rhce.cc --ignore-daemonsets
kubectl delete nodes vms201.rhce.cc

完成后可以到集群已经没有了:

[root@vms201 ~]# kubectl get nodes
No resources found

步骤2:在三台设备上清空设置

kubeadm reset

步骤3:在master上重新初始化集群

kubeadm init --image-repository registry.aliyuncs.com/google_containers --kubernetes-version=v1.21.0 --pod-network-cidr=10.244.0.0/16

步骤4:在master上创建k8s认证文件

上一步初始化完成后会有提示信息,依次复制提信息中的三条命令即可:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

注意提示是否覆盖时选择y。

步骤5:两台work noeds加入集群
在master上:

kubeadm  token create --print-join-command

将显示的内容复制到两台work nodes即可。然后在master上查看nodes:

[root@vms201 ~]# kubectl get nodes
NAME             STATUS   ROLES                  AGE     VERSION
vms201.rhce.cc   Ready    control-plane,master   5m36s   v1.21.0
vms202.rhce.cc   Ready    <none>                 91s     v1.21.0
vms203.rhce.cc   Ready    <none>                 87s     v1.21.0

可以看懂已经重新创建集群。但是这里有一个问题就是STATUS是Ready,这是因为我们之前装过了calico的原因,这个数据已经写入到了etcd数据中了,但是重装K8s后calico也需要重新安装:

kubectl apply -f  calico.yaml

注意:如果master没有重置,只重置了worker,是不需要安装calico的。

五、部署多master的场景

当集群中仅存在一个master节点时,如果其出现了故障,会导致K8s的控制平面完全失效。所以为了保证K8s集群的高可靠性,我们可以设置多个master,当其中部分master出现故障时,其他master依然能够管理整个集群。

正常情况下,我们可以使用一个负载均衡器将请求转发给集群中的master,如果有一天其中的一个master出现故障后,负载均衡器仅需要将请求发送给依旧运行正常的master即可。
在这里插入图片描述

环境中有2个master,1个worker node。管理流量访问负载均衡器haproxy,地址为192.168.0.101,然后流量被均匀负载到两个master上。两个master之间的数据由etcd来同步。如果想要更高的可靠性,可以设置两个以上的loadbalance、和worker,这里仅是实验演示master的高可用性。

loadbalance安装步骤:

yum inastll haproxy -y

编辑配置文件,在文件末尾设置关联的master:

vim /etc/haproxy/haproxy.cfg

两个服务器的权重相同:

listen k8s-lb *:6443
        mode tcp
        balance roundrobin
        server s1 192.168.0.200:6443 weight 1
        server s2 192.168.0.201:6443 weight 1

启动服务并查看状态:

systemctl enable haproxy --now

[root@vms101 ~]# systemctl enable haproxy --now
Created symlink from /etc/systemd/system/multi-user.target.wants/haproxy.service to /usr/lib/systemd/system/haproxy.service.
[root@vms101 ~]# systemctl status haproxy
● haproxy.service - HAProxy Load Balancer
   Loaded: loaded (/usr/lib/systemd/system/haproxy.service; enabled; vendor preset: disabled)
   Active: active (running) since 一 2021-07-19 03:14:36 CST; 24s ago
 Main PID: 1681 (haproxy-systemd)
   CGroup: /system.slice/haproxy.service
           ├─1681 /usr/sbin/haproxy-systemd-wrapper -f /etc/haproxy/haproxy.cfg -p /run/h...
           ├─1682 /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -Ds
           └─1683 /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -Ds

719 03:14:36 vms206.rhce.cc systemd[1]: Started HAProxy Load Balancer.
719 03:14:36 vms206.rhce.cc systemd[1]: Starting HAProxy Load Balancer...
719 03:14:36 vms206.rhce.cc haproxy-systemd-wrapper[1681]: haproxy-systemd-wrapper: e...
719 03:14:36 vms206.rhce.cc haproxy-systemd-wrapper[1681]: [WARNING] 199/031436 (1682...
719 03:14:36 vms206.rhce.cc haproxy-systemd-wrapper[1681]: [WARNING] 199/031436 (1682...
Hint: Some lines were ellipsized, use -l to show in full.

etcd安装请参考:
https://blog.csdn.net/tushanpeipei/article/details/118409836?spm=1001.2014.3001.5501

部署多master集群时需要注意的点:
大体和部署单master时一致,不同的是可以选择使用yaml文件在第一个master上来初始化集群:

kubeadm init --config=kubeadm-config.yaml

kubeadm-config.yaml文件从kubeadm config view获取,修改控制平面选项controlPlaneEndpoint,指向了haproxy的地址:

apiServer:
  extraArgs:
    authorization-mode: Node,RBAC
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
controlPlaneEndpoint: "192.168.0.101:6443"
clusterName: kubernetes
controllerManager: {}
dns:
  type: CoreDNS
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: v1.21.0
networking:
  dnsDomain: cluster.local
  podSubnet: 10.244.0.0/16
  serviceSubnet: 10.96.0.0/12
scheduler: {}

完成后会和单节点相同,提示将其余的worker node和master加入集群的命令。如果是master身份加入集群,需要在以worker node加入的命令后写上–control-plane。

然后需要将在第一个master上的/etc/kubernetes/pki下的所有证书文件拷贝到其他master的相同目录下去。

更好的部署master高可用性的方式:sealos
参考文档https://www.sealyun.com/

整理资料来源:
《老段CKA课程》

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐