Skip to content
首页/server/本文内容

Centos7系统上K8S (v1.28)集群部署

基于centos7 部署kubernete v1.28 集群,一个master节点,三个node节点

前置步骤

1、关闭防火墙

systemctl disable firewalld
systemctl stop firewalld

2、关闭selinux(临时/永久)

# 临时禁用selinux(本示例是临时关闭的)
setenforce 0

# 永久关闭selinux 
# 修改/etc/sysconfig/selinux文件设置
sed -i 's/SELINUX=permissive/SELINUX=disabled/' /etc/sysconfig/selinux
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config

3、禁用Swap(交换)分区

swapoff -a
sed -i 's/.*swap.*/#&/' /etc/fstab

安装Docker

1、更新yum源

yum update -y

2、设置存储库

sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

3、安装Docker (Engine) 及其它依赖库。

sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Installed:
  containerd.io.x86_64 0:1.6.31-3.1.el7          docker-buildx-plugin.x86_64 0:0.14.0-1.el7           docker-ce.x86_64 3:26.1.1-1.el7         
  docker-ce-cli.x86_64 1:26.1.1-1.el7            docker-compose-plugin.x86_64 0:2.27.0-1.el7         

Dependency Installed:
  audit-libs-python.x86_64 0:2.8.5-4.el7           checkpolicy.x86_64 0:2.5-8.el7          container-selinux.noarch 2:2.119.2-1.911c772.el7_8 
  docker-ce-rootless-extras.x86_64 0:26.1.1-1.el7  fuse-overlayfs.x86_64 0:0.7.2-6.el7_8   fuse3-libs.x86_64 0:3.6.1-4.el7                    
  libcgroup.x86_64 0:0.41-21.el7                   libsemanage-python.x86_64 0:2.5-14.el7  policycoreutils-python.x86_64 0:2.5-34.el7         
  python-IPy.noarch 0:0.75-6.el7                   setools-libs.x86_64 0:3.3.8-4.el7       slirp4netns.x86_64 0:0.4.3-4.el7_8                 

Complete!

4、启动Docker,设置开机自启动,查看Docker状态为active (running) 即为启动成功。

$ sudo systemctl start docker
$ sudo systemctl enable docker
$ sudo systemctl status docker

alt text

安装cri-dockerd

1、压缩包下载

建议本地下载完压缩包后再上传至服务器,压缩包文件地址: https://github.com/Mirantis/cri-dockerd/releases

alt text

2、解压

压缩包上传至服务器后,解压:

rpm -ivh cri-dockerd-0.3.13-3.el7.x86_64.rpm

alt text

3、重载系统守护进程→设置cri-dockerd自启动→启动cri-dockerd

$ sudo systemctl daemon-reload # 重载系统守护进程
$ sudo systemctl enable cri-docker.socket cri-docker # 设置cri-dockerd自启动
$ sudo systemctl start cri-docker.socket cri-docker # 启动cri-dockerd
$ sudo systemctl status cri-docker.socket

alt text

4、Docker和cri-dockerd设置国内镜像加速。

注意: ****** 需要改成自己阿里云的镜像加速地址

$ sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://*** */.mirror.aliyuncs.com"]
}
EOF
$ vi /usr/lib/systemd/system/cri-docker.service # 找到第10行ExecStart= 修改为
ExecStart=/usr/bin/cri-dockerd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.7
$ systemctl daemon-reload && systemctl restart docker cri-docker.socket cri-docker # 重启Docker组件,这个地方是个小技巧,连写会方便很多
$ systemctl status docker cir-docker.socket cri-docker # 检查Docker组件状态

这一步如果跳过,会出现kubeadm init 健康检查超时,同时使用 journalctl -xeu kubelet | grep error 会出现如下错误,并且node无法加入master节点,会出现网络连接错误

 error: code = Unknown desc = failed pulling image \\\"registry.k8s.io/pause:3.9\\\": Error response from daemon: Head \\\"https://us-west2-docker.pkg.dev/v2/k8s-artifacts-prod/images/pause/manifests/3.9\\\": dial tcp 64.233.187.82:443: i/o timeout\"" pod="kube-system/etcd-k8s-master" podUID="241c98dbd46abfef5832021e5d3ba767"

安装Kubernetes

安装 kubeadm、kubelet 和 kubectl,配置yum文件,因为国内无法直接访问google,这里需要将官网中的google的源改为国内源,以阿里云为例:

cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=1
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
        http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
EOF

在Master端执行:

# 安装kubeadm、kubectl、kubelet
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

# 启动kubelet服务
systemctl enable kubelet && systemctl start kubelet

# 查看版本
kubectl version --client

在Node端执行:

# 安装kubeadm、kubelet
yum install -y kubeadm kubelet --disableexcludes=kubernetes

# 启动kubelet服务
systemctl enable kubelet && systemctl start kubelet

初始化K8S集群

!!初始化之前一定先修改Master机的主机名,每台设备的主机名一定不能相同!!执行:

# master执行
hostnamectl --static set-hostname k8s-master # master节点
hostname $hostname # 立刻生效

# node1执行
hostnamectl --static set-hostname k8s-node1

# node2执行
hostnamectl --static set-hostname k8s-node2

# node3执行
hostnamectl --static set-hostname k8s-node3

修改hosts表,执行 vim /etc/hosts 添加各个节点的映射

192.168.18.197 k8s-master
192.168.18.198 k8s-node1
192.168.18.199 k8s-node2
192.168.18.202 k8s-node3

初始化Master节点

  • image-repository是镜像源,由于kubeadm 默认从官网http://k8s.grc.io下载所需镜像,国内无法访问,因此需要通过image-repository指定阿里云镜像仓库地址。
  • apiserver-advertise-address是Master机的IP地址,在本例中是192.168.233.10
  • pod-network-cidr是POD的网段,本例中将其设为10.122.0.0/16,可自行修改。
kubeadm init --image-repository=registry.aliyuncs.com/google_containers --cri-socket=unix:///var/run/cri-dockerd.sock --apiserver-advertise-address=192.168.18.197 --pod-network-cidr=10.244.0.0/16

初始化完成后提示: alt text

kubeadm join 192.168.18.197:6443 --token vbf58b.mbezuyb4uzr1kdnu \
        --discovery-token-ca-cert-hash sha256:fcfdb72a97b70e74cad76f6e34013feb5809bca3359e49769a2a9ec02512ec84

需要保存最后的token以备Node加入,现在按照上述提示,我们继续执行

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

查看Master结点的安装状态:

kubectl get nodes

alt text

目前没有就绪,不需要管这个,在 Master设备上安装K8S路由插件Calico:

安装网络插件(Calico),master执行:

参考地址: https://docs.tigera.io/calico/latest/getting-started/kubernetes/quickstart

# 建议本地下载完后上传至服务器
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.27.3/manifests/tigera-operator.yaml
# 如果是下载至本地则执行:
kubectl create -f tigera-operator.yaml

wget https://raw.githubusercontent.com/projectcalico/calico/v3.27.3/manifests/custom-resources.yaml

注意将custom-resiyrces.yaml的cidr配置改成初始化mater节点的ip地址alt text

保存修改,然后执行:

kubectl create -f custom-resources.yaml
  • 若立刻查看master状态可能仍然不是ready状态,原因是部分pod尚未准备就绪
kubectl get nodes
  • 稍等片刻等待上面的pod状态变为下图,即证明网络插件Calico已经安装完毕了
watch kubectl get pods -n calico-system

alt text

kubectl get nodes

alt text

将Node加入集群

1、在执行join指令前还需要将master节点上的/etc/kubernetes/admin.conf拷贝到node节点上.

# 格式:scp ${current_server_path}/file_name target_server_ip:${target_server_path} 
$ scp /etc/kubernetes/admin.conf 192.168.18.199:/etc/kubernetes/

# 到node节点检查admin.conf文件是否传输完成
$ cd /etc/kubernetes
$ ls
admin.conf  manifests
# 不要忘记将admin.conf加入环境变量,这里直接使用永久生效。
$ echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >>  ~/.bash_profile 
$ source ~/.bash_profile

如果第1步操作遗漏掉了的话,在执行get nodes的时候会收到以下错误:

$ kubectl get nodes
E0704 21:50:22.095009   28309 memcache.go:265] couldn't get current server API group list: Get "http://localhost:8080/api?timeout=32s": dial tcp [::1]:8080: connect: connection refused
E0704 21:50:22.099568   28309 memcache.go:265] couldn't get current server API group list: Get "http://localhost:8080/api?timeout=32s": dial tcp [::1]:8080: connect: connection refused
E0704 21:50:22.104090   28309 memcache.go:265] couldn't get current server API group list: Get "http://localhost:8080/api?timeout=32s": dial tcp [::1]:8080: connect: connection refused

2、执行(kubeadm init 成功后返回的内容):

# 我这边使用的docker做的k8s集群,需要指定镜像类型,在末尾添加:
--cri-socket=unix:///var/run/cri-dockerd.sock
# 忘记了通过此命令获取: kubeadm token create --print-join-command

kubeadm join 192.168.18.197:6443 --token o3488m.mxu1izv8msmg54gc --discovery-token-ca-cert-hash sha256:fcfdb72a97b70e74cad76f6e34013feb5809bca3359e49769a2a9ec02512ec84 --cri-socket=unix:///var/run/cri-dockerd.sock

alt text

3、在任意节点执行 kubectl get nodes。如果节点都是ready的话说明整个集群状态是正常的。同时通过kubectl get pod指令查看所有pod是否正常,正常状态下,所有pod的状态都应是Running。

# node节点使用一下命令查看错误日志
$ journalctl -f -u kubelet.service
$ kubectl get nodes

alt text