注意2:确保在干净的系统上开始安装,不要使用曾经装过kubeadm或其他k8s发行版的环境
注意1:确保各节点时区设置一致、时间同步。 如果你的环境没有提供NTP 时间同步,推荐集成安装chrony
IP地址 | 角色 |
---|---|
10.124.130.141 | master01(部署节点) |
10.124.130.142 | master02 |
10.124.130.144 | master03 |
10.124.130.145 | node01 |
10.124.130.147 | node02 |
10.124.130.148 | node03 |
10.124.130.150 | node04 |
10.124.130.151 | node05 |
高可用集群所需节点配置如下
角色 | 数量 | 描述 |
---|---|---|
部署节点 | 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