K8S 集群安装部署
1.关闭防火墙 systemctl stop firewalld systemctl disable firewalld 2.网桥过滤 cat <<EOF | sudo tee /etc/modules-load.d
1.关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
2.网桥过滤
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sudo sysctl --system
3.从阿里云服务器同步时间
yum -y install ntpdate
ntpdate http://time1.aliyun.com
删除本地时间并设置时区为上海
rm -rf /etc/localtime
ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
4.关闭swap分区
#临时关闭:
swapoff -a
#永久关闭:
vi /etc/fstab
#将文件中的/dev/mapper/centos-swap这行代码注释掉
#/dev/mapper/centos-swap swap swap defaults 0 0
#确认swap已经关闭:若swap行都显示 0 则表示关闭成功
free -m
5.配置hosts
cat <<EOF | sudo tee /etc/hosts
192.168.80.127 k8s-master01
192.168.80.128 k8s-node01
192.168.80.129 k8s-node02
192.168.80.130 k8s-node03
EOF
6.安装docker
安装docker 前置
yum install -y yum-utils device-mapper-persistent-data lvm2
添加阿里云的yum 源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
#查看版本
yum list docker-ce --showduplicates | sort -r
#安装指定版本
yum -y install docker-ce-18.09.8
#检查docker 版本
docker version
#开启docker 服务
systemctl start docker
#开机启动
systemctl enable docker
7.配置docker 容器驱动方式 Cgroup drivers
Container runtimes
支持四种方式
- containerd
- CRI-O
- Docker Engine
- Mirantis Container Runtime
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
#重启docker服务:
systemctl daemon-reload
systemctl restart docker
8.下载k8s相关镜像
一般会遇到遇到检测资源未通过,可以采用以下方式,如果还是出现问题,可以在下面的repo文件配置中关掉检查
wget https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
wget https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
rpm --import yum-key.gpg
rpm --import rpm-package-key.gpg
# 创建yum k8s 仓库配置
vi /etc/yum.repos.d/kubernates.repo
# 复制一下内容到文件中
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
# 是否检测资源,如果为1时安装失败,可以设置为0 关闭检测
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
#保存退出
:wq
yum clean all
yum -y makecache
#获取版本信息
yum list kubelet --showduplicates | sort -r
#安装k8s 相关套件
yum install -y kubelet-1.23.5 kubeadm-1.23.5 kubectl-1.23.5
systemctl enable kubelet
查看集群需要的镜像
kubeadm config images list
编写脚本替换镜像tag
mkdir -p /data
cd /data
vi images.sh
#!/bin/bash
# 下面的镜像应该去除"http://k8s.gcr.io"的前缀,版本换成kubeadm config images list命令获取到的版本
images=(
kube-apiserver:v1.23.5
kube-controller-manager:v1.23.5
kube-scheduler:v1.23.5
kube-proxy:v1.23.5
pause:3.6
etcd:3.5.1-0
coredns:1.8.6
)
for imageName in ${images[@]} ;
do
docker pull http://registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
docker tag http://registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName http://k8s.gcr.io/$imageName
docker rmi http://registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
done
#保存退出
:wq
#执行脚本
sh /data/images.sh
#注意 cordns 镜像路径存在调整,需要对coredns 重新打一个tag
docker tag http://k8s.gcr.io/coredns:1.8.6 http://k8s.gcr.io/coredns/coredns:v1.8.6
# 注意 1.23.5版本中存在一个问题coredns 仓库路径与1.17不同,多一层路径,需要重新tag一个镜像
# docker tag http://k8s.gcr.io/coredns:1.8.6 http://k8s.gcr.io/coredns/coredns:v1.8.6
9.安装calico network policy [CNI(Container network interface)]
docker pull calico/cni:v3.21.3
docker pull calico/pod2daemon-flexvol:v3.21.3
docker pull calico/node:v3.21.3
docker pull calico/kube-controllers:v3.21.3
#配置主机名
hostnamectl set-hostname k8s-master01
10.初始化集群 master
kubeadm init --apiserver-advertise-address=192.168.80.127 --kubernetes-version v1.23.5 --service-cidr=10.1.0.0/16 --pod-network-cidr=10.244.0.0/16
##看到以下结果表示成功
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.80.127:6443 --token l9xgtp.crdwbikds1rt3iiv
--discovery-token-ca-cert-hash sha256:65a7aeb890ff889da742f7ad6dc336e09fcb5cb6c95909a99931c721fc36c4e1
11.初始化网络插件
flannel方案
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
calico方案(未实现)
curl https://projectcalico.docs.tigera.io/manifests/calico-etcd.yaml -o calico.yaml
kubectl apply -f calico.yaml
12.node 加入集群
kubeadm join 192.168.80.127:6443 --token csgdh3.h5i2rde8gmjvx255
--discovery-token-ca-cert-hash sha256:e396f402d4888d12a9694f4e5810c6757c41e15f38961b1386666bc15743422e
重新初始化:
kubeadm reset
问题:
- Coredns 一直处于创建状态(calico 未解决方案,更换其他网络插件--flanneld)
查看pod信息
kubectl describe pod coredns-64897985d-ghwtc -n kube-system
发现最后显示 network: stat /var/lib/calico/nodename: no such file or directory:
Warning FailedCreatePodSandBox 6m20s (x5981 over 17h) kubelet (combined from similar events): Failed to create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container "ecb5ac36e4c73944bfb0d180425232e88b378d9238ce8d40951721210178ec09" network for pod "coredns-64897985d-ghwtc": networkPlugin cni failed to set up pod "coredns-64897985d-ghwtc_kube-system" network: stat /var/lib/calico/nodename: no such file or directory: check that the calico/node container is running and has mounted /var/lib/calico/
touch /var/lib/calico/nodename
vi /var/lib/calico/nodename
192.168.80.127
#保存退出
:wq
2.flanneld 同样出现上述coredns一直处于creating 状态问题;
解决方案:
coredns状态卡在ContainerCreating_鲲鹏BoostKit_鲲鹏论坛_华为云论坛 (huaweicloud.com)
步骤一:在所有节点(master和slave节点)删除cni0,以及暂停k8s和docker。
kubeadm reset
systemctl stop kubelet
systemctl stop docker
rm -rf /var/lib/cni/
rm -rf /var/lib/kubelet/
rm -rf /etc/cni/
ifconfig cni0 down
ifconfig flannel.1 down
ifconfig docker0 down
ip link delete cni0
ip link delete flannel.1
步骤二:在所有节点重启kubelet和docker
systemctl start kubelet
systemctl start docker
步骤三:重新执行kubeadm init的操作。
基于上述逻辑,猜测是网络地址冲突导致。
问题列表:
1.物理机断电重启,集群环境未启动,所有容器都没启动
1.kubectl get pod -A
connection refused ...
2.检查docker 是否运行正常 docker ps -a
结果所有的container 都显示 Exist (2xx) a hour ago...
由此推断整个k8s环境未启动
3.执行docker 重启
systemctl daemon-reload
systemctl restart docker
依旧未启动任何容器
4.执行kubectl 重启
systemctl restart kubectl
可以看到所有pod 列表已正常出现,但是并未运行成功,依旧是断电前的状态,实际上服务都不可用
等待一段时间后,发现kube-system 环境已经正常, 但是无法分配pod 进行创建实例
5.通过检查集群状态 kubectl get nodes
发现只有master 处于ready 状态,两个data node都是NotRead,重启两个节点状态未变
6.直接采取暴力解决方案
在data node 上执行 kubeadm reset 重置节点,重新将节点加入到集群
7.重新加入集群
在master 节点重新创建一个token ,之前的token 大概率失效了已经
kubeadm token create
执行指令后会输入新创建的token
通过下面指令获取 join 的sha256的值
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null |
openssl dgst -sha256 -hex | sed 's/^.* //'
执行后得到现在的sha256的值
执行join 指令
kubeadm join 192.168.80.127:6443 --token csgdh3.h5i2rde8gmjvx255
--discovery-token-ca-cert-hash sha256:e396f402d4888d12a9694f4e5810c6757c41e15f38961b1386666bc15743422e
8.两个data node 都执行同样操作后,再次检查集群节点状态发现已经全部ready
9.继续kubectl get pod -A 发现虽然所有app pod 进入creating 状态,但是镜像一直拉取失败,由此定位到镜像仓库问题,发现harbor 未就绪
10.通过 kubectl describe pod ${containerId} -n harbor,发现harbor 一直在pulling image
由于是拉取的官网镜像,很慢,只能等,大概15分钟后,harbor 就绪
11.harbor 就绪后,不着急就等待容易重启拉取镜像,app 相关pod 应该就会就绪。
由于集群会存在一些前置启动后,其他pod才能正常启动的问题,所以发现一些一直不成功,可以尝试重启docker 解决。或者直接删除对应pod ,重新调度
*12.特殊问题:
由于dapr 类app 需要在每个pod中注入一个dapr sidecar,但是此时看到的所有的dapr 类app 并未是 2/2状态,只是1/1的runing 状态,推断 dapr sidecar 并未启动。
导致这种情况的可能性:由于是断电重启,所有pod 同时调度,因此dapr 系统环境未就绪前,dapr 类app 也进入调度中,导致 dapr injector 无法将side car 注入到每个dapr app 的container中。
等待 dapr 系统环境就绪后,删除对应的dapr app pod 等待重新调度即可。