kubeasz安装高可用的K8S

image-20210416091142502

注意2:确保在干净的系统上开始安装,不要使用曾经装过kubeadm或其他k8s发行版的环境

注意1:确保各节点时区设置一致、时间同步。 如果你的环境没有提供NTP 时间同步,推荐集成安装chrony

IP地址角色
10.124.130.141master01(部署节点)
10.124.130.142master02
10.124.130.144master03
10.124.130.145node01
10.124.130.147node02
10.124.130.148node03
10.124.130.150node04
10.124.130.151node05

高可用集群所需节点配置如下

角色数量描述
部署节点1运行ansible/ezctl命令,设备有限选择集群中的一台作为部署节点
etcd节点3注意etcd集群需要1,3,5,…奇数个节点,一般复用master节点
master节点3高可用集群3个master节点
node节点5运行应用负载的节点,可根据需要提升机器配置/增加节点数

注意:默认配置下容器/kubelet会占用/var的磁盘空间,如果磁盘分区特殊,可以设置config.yml中的容器/kubelet数据目录:CONTAINERD_STORAGE_DIR DOCKER_STORAGE_DIR KUBELET_ROOT_DIR

按照如下步骤先规划准备,在clusters/${cluster_name}/hosts 配置节点信息后,直接安装多节点高可用集群

在部署节点安装ansible及准备ssh免密登陆

选择一个集群做为ansible的部署节点,比如我这边选择master01做为部署节点

能访问外网直接使用yum安装

yum -y install epel-release
yum -y install ansible

离线安装需要设置yum本地仓库来安装

#提前准备好安装ansible所需要的软件包,可以找一台能访问外网的机子配置yum,安装时同时下载软件包
#打开yum配置文件
vim /etc/yum.conf
...
cachedir=/var/cache/yum/$basearch/$releasever #可以自定义下载软件包的存放位置
keepcache=0 #改成1,开启yum安装,同时缓存软件包
#安装ansible
yum -y install epel-release
yum -y install ansible
#找到下载下来的软件包,并拷贝到部署节点上
mkdir local_repo
cp /var/cache/yum/$basearch/$releasever/epel/packages/* /local_repo/
cp /var/cache/yum/$basearch/$releasever/base/packages/* /local_repo/
#上传步骤省略,可以自行上传,如果在一个局域网可以使用scp rsync等工具
#部署节点配置本地仓库
vim /etc/yum.repos.d/local.repo
[local_ansible]
name=local
baseurl=file:///home/hisun/local_repo  #安装包路径
gpgcheck=0
enabled=1
#将local_repo设置成本地仓库
createrepo /home/hisun/local_repo
#刷新yum缓存
yum makecache
#安装ansible
yum -y install ansible

配置ssh免密登录

# 更安全 Ed25519 算法
ssh-keygen -t ed25519 -N '' -f ~/.ssh/id_ed25519
# 或者传统 RSA 算法
ssh-keygen -t rsa -b 2048 -N '' -f ~/.ssh/id_rsa

ssh-copy-id $IPs #$IPs为所有节点地址包括自身,按照提示输入yes 和root密码

在部署节点编排k8s安装

下载项目源码、二进制及离线镜像

# 下载工具脚本ezdown,举例使用kubeasz版本3.0.0
export release=3.0.0
curl -C- -fLO --retry 3 https://github.com/easzlab/kubeasz/releases/download/${release}/ezdown
chmod +x ./ezdown
# 使用工具脚本下载
cd /etc/kubeasz
./ezdown -D
# 上述脚本运行成功后,所有文件(kubeasz代码、二进制、离线镜像)均已整理好放入目录/etc/kubeasz

离线安装,同上面一样,找一台能访问外网的机子下载kubeasz代码、二进制、离线镜像,离线系统包,拷贝到部署节点

#离线安装需要下载离线系统包,其余与上面步骤一致
cd /etc/kubeasz
./ezdown -P
#上述脚本运行成功后,所有文件(kubeasz代码、二进制、离线镜像)均已整理好放入目录/etc/kubeasz
/etc/kubeasz #包含 kubeasz 版本为 ${release} 的发布代码
/etc/kubeasz/bin #包含 k8s/etcd/docker/cni 等二进制文件
/etc/kubeasz/down #包含集群安装时需要的离线容器镜像
/etc/kubeasz/down/packages #包含集群安装时需要的系统基础软件

#上传步骤省略,可以自行上传/etc/kubeasz到部署节点,如果在一个局域网可以使用scp rsync等工具

创建集群配置实例

ezctl new <集群名>
# 然后根据提示配置'/etc/kubeasz/clusters/<集群名>/hosts' 和 '/etc/kubeasz/clusters/<集群名>/config.yml':根据前面节点规划修改hosts 文件和其他集群层面的主要配置选项;其他集群组件等配置项可以在config.yml 文件中修改。

修改hosts配置文件

vim /etc/kubeasz/clusters/<集群名>/hosts
[etcd]  
10.124.130.141
10.124.130.142
10.124.130.144
# master node(s)
[kube_master]
10.124.130.141
10.124.130.142
10.124.130.144
# work node(s)
[kube_node]
10.124.130.145
10.124.130.147
10.124.130.148
10.124.130.150
10.124.130.151
...
[chrony]
10.124.130.141 #设置时间同步服务器
...
CONTAINER_RUNTIME="docker"  #可以设置其他容器运行时

修改config配置文件

vim clusters/istio_test/config.yml
# 可选离线安装系统软件包 (offline|online)
INSTALL_SOURCE: "offline"
# [containerd]容器持久化存储目录
CONTAINERD_STORAGE_DIR: "/data/containerd"
KUBELET_ROOT_DIR: "/data/kubelet"
...
#还有很多参数可以修改,请自行按需配置,不再赘述

开始安装 如果你对集群安装流程不熟悉,可使用分步安装,并对 每步都进行验证

# 一键安装
ezctl setup k8s-01 all

# 或者分步安装,具体使用 ezctl help setup 查看分步安装帮助信息
ezctl setup <集群名> 01
ezctl setup <集群名> 02
ezctl setup <集群名> 03
ezctl setup <集群名> 04
...

安装完成后,按步骤验证各个组件

验证etcd

# 注意:证书是在部署节点创建好之后推送到目标etcd节点上去的,以增加ca证书的安全性
#上传到各个etcd节点
for i in 1 2 4 do; \
ssh root@192.168.1.$i "mkdir -p /etc/etcd/ssl" \
rsync -a /etc/kubeasz/clusters/istio_test/ssl/ca.pem  root@192.168.1.$i:/etc/etcd/ssl/ \
ssh root@192.168.1.$i "mkdir -p /etc/etcd/ssl"
rsync -a /etc/kubeasz/clusters/istio_test/ssl/etcd.pem  root@192.168.1.$i:/etc/etcd/ssl/ \
ssh root@192.168.1.$i "mkdir -p /etc/etcd/ssl"
rsync -a /etc/kubeasz/clusters/istio_test/ssl/etcd-key.pem  root@192.168.1.$i:/etc/etcd/ssl/ \
;done
  • systemctl status etcd 查看服务状态
  • journalctl -u etcd 查看运行日志
  • 在任一 etcd 集群节点上执行如下命令
# 根据hosts中配置设置shell变量 $NODE_IPS
export NODE_IPS="10.124.130.141 10.124.130.142 10.124.130.144"
for ip in ${NODE_IPS}; do
 ETCDCTL_API=3 etcdctl \
 --endpoints=https://${ip}:2379  \
 --cacert=/etc/kubernetes/ssl/ca.pem \
 --cert=/etc/etcd/ssl/etcd.pem \
 --key=/etc/etcd/ssl/etcd-key.pem \
 endpoint health; done

预期结果:

https://10.124.130.141:2379 is healthy: successfully committed proposal: took = 2.210885ms
https://10.124.130.142:2379 is healthy: successfully committed proposal: took = 2.784043ms
https://10.124.130.144:2379 is healthy: successfully committed proposal: took = 3.275709ms

三台 etcd 的输出均为 healthy 时表示集群服务正常。

验证容器运行时

安装成功后验证如下:

systemctl status docker     # 服务状态
journalctl -u docker # 运行日志
docker version
docker info

iptables-save|grep FORWARD 查看 iptables filter表 FORWARD链,最后要有一个 -A FORWARD -j ACCEPT 保底允许规则

iptables-save|grep FORWARD
:FORWARD ACCEPT [0:0]
:FORWARD DROP [0:0]
-A FORWARD -j DOCKER-USER
-A FORWARD -j DOCKER-ISOLATION
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o docker0 -j DOCKER
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
-A FORWARD -j ACCEPT

验证 master 集群

验证 master节点的主要组件:

# 查看进程状态
systemctl status kube-apiserver
systemctl status kube-controller-manager
systemctl status kube-scheduler
# 查看进程运行日志
journalctl -u kube-apiserver
journalctl -u kube-controller-manager
journalctl -u kube-scheduler

执行 kubectl get componentstatus 可以看到

NAME                 STATUS    MESSAGE              ERROR
scheduler            Healthy   ok                  
controller-manager   Healthy   ok                  
etcd-0               Healthy   {"health": "true"}  
etcd-2               Healthy   {"health": "true"}  
etcd-1               Healthy   {"health": "true"}

验证 node 状态

systemctl status kubelet    # 查看状态
systemctl status kube-proxy
# 查看日志
journalctl -u kube-proxy

运行 kubectl get node可以看到类似

NAME             STATUS          ROLES     AGE       VERSION
10.124.130.145   Ready           node     4d13h   v1.20.2
10.124.130.147   Ready           node     4d13h   v1.20.2
10.124.130.148   Ready           node     4d12h   v1.20.2
10.124.130.150   Ready           node     4d13h   v1.20.2
10.124.130.151   Ready           node     4d13h   v1.20.2

验证 flannel 网络

执行flannel安装成功后可以验证如下:(需要等待镜像下载完成,有时候即便上一步已经配置了docker国内加速,还是可能比较慢,请确认以下容器运行起来以后,再执行后续验证步骤)

# kubectl get pod --all-namespaces
NAMESPACE     NAME                    READY     STATUS    RESTARTS   AGE
kube-system   kube-flannel-ds-m8mzm   1/1       Running   0          3m
kube-system   kube-flannel-ds-mnj6j   1/1       Running   0          3m
kube-system   kube-flannel-ds-mxn6k   1/1       Running   0          3m

在集群创建几个测试pod

#kubectl apply -f flanel_check.yml
vim flanel_check.yml
apiVersion: apps/v1
kind: Deployment
metadata:
 name: test
 labels:
   app.kubernetes.io/name: test
spec:
 selector:
   matchLabels:
     app.kubernetes.io/name: test
 replicas: 3
 template:
   metadata:
     labels:
       app.kubernetes.io/name: test
   spec:
     containers:
     - name: test
       image: nginx
       ports:
       - containerPort: 80
# kubectl get pod --all-namespaces -o wide|head -n 4
NAMESPACE     NAME                    READY     STATUS    RESTARTS   AGE       IP             NODE
default       nginx-5956b54c8b-ld4gb   1/1       Running   0          9m        172.20.2.7   10.124.130.145
default       nginx-5956b54c8b-lj9l9   1/1       Running   0          9m        172.20.1.5   10.124.130.147
default       nginx-5956b54c8b-wwpkz   1/1       Running   0          9m        172.20.0.6   10.124.130.148
...
# 查看路由
# ip route
default via 10.124.130.129 dev bond0
10.124.130.0/24 dev ens3  proto kernel  scope link  src 10.124.130.145
172.17.0.0/16 dev docker0  proto kernel  scope link  src 172.17.0.1 linkdown
172.20.0.0/24 via 10.124.130.147 dev bond0
172.20.1.0/24 via 10.124.130.148 dev bond0
172.20.2.0/24 dev cni0  proto kernel  scope link  src 172.20.2.1
...

在各节点上分别 ping 这三个POD IP地址,确保能通:

ping 172.20.2.7
ping 172.20.1.5
ping 172.20.0.6

验证DNS

kubectl get pods -n kube-system | grep dns
coredns-5787695b7f-7vt8k                     1/1     Running   0          16h
coredns-5787695b7f-gfgbq                     1/1     Running   0          16h
coredns-5787695b7f-j2jtw                     1/1     Running   0          16h
node-local-dns-7gljp                         1/1     Running   0          16h
node-local-dns-bbnkb                         1/1     Running   0          16h
node-local-dns-cssw7                         1/1     Running   0          16h
node-local-dns-fvvd6                         1/1     Running   0          16h
node-local-dns-j8wh4                         1/1     Running   0          16h
node-local-dns-jcwfv                         1/1     Running   0          16h
node-local-dns-tjtdr                         1/1     Running   0          16h
node-local-dns-z478r                         1/1     Running   0          16h
#注意,如果coreDNS没有正常运行,有可能是DNS解析问题,请检查/etc/resolv.conf是否有正确配置DNS

参考链接:https://github.com/easzlab/kubeasz

此条目发表在k8s分类目录。将固定链接加入收藏夹。

发表评论