K8S部署-新版本

Administrator 7 2025-06-20

1. 准备工作(所有节点执行)

1.1. 准备虚拟机

三个节点:名字为k8s-node1、k8s-node2、k8s-master

设置系统主机名及Host 文件

cat << EOF >> /etc/hosts
192.168.175.133 k8s-master
192.168.175.134 k8s-node1
192.168.175.135 k8s-node2
EOF
# 对应的节点执行
hostnamectl set-hostname k8s-node1
hostnamectl set-hostname k8s-node2
hostnamectl set-hostname k8s-master

1.2 更新yum

# 需要更新很久
yum update -y
#设置存储库
yum install -y yum-utils

#使用官方源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
#or 使用国内源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

1.3 相关设置

1.3.1 禁用iptables和firewalld服务

systemctl stop firewalld
systemctl disable firewalld

systemctl stop iptables
systemctl disable iptables

1.3.2 禁用selinux

# 永久关闭
sed -i 's/enforcing/disabled/' /etc/selinux/config
# 临时关闭
setenforce 0

1.3.3 禁用swap分区

# 临时关闭
swapoff -a
# 永久关闭
vim /etc/fstab
	将行 
	/dev/mapper/xxx    swap   xxx
	注释

1.3.4 调整内核参数,对于 K8S

cat <<EOF | tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF
# 依次执行下面命令
sysctl -p
modprobe br_netfilter
lsmod | grep br_netfilter

1.3.5 配置 ipvs 功能

# 安装ipset和ipvsadm
yum install ipset ipvsadmin -y
#如果提示No package ipvsadmin available.需要使用
yum install ipvsadm
# 添加需要加载的模块写入脚本文件
cat <<EOF > /etc/sysconfig/modules/ipvs.modules
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
# 为脚本文件添加执行权限
chmod +x /etc/sysconfig/modules/ipvs.modules
# 执行脚本文件
/bin/bash /etc/sysconfig/modules/ipvs.modules
# 查看对应的模块是否加载成功
lsmod | grep -e ip_vs -e nf_conntrack_ipv4

重启

reboot

2. 安装docker和cri-dockerd(所有节点执行)

2.1 安装docker

2.1.1 移除旧版docker(新安装虚拟机则不需执行)

yum remove docker \
     docker-client \
     docker-client-latest \
     docker-common \
     docker-latest \
     docker-latest-logrotate \
     docker-logrotate \
     docker-engine

2.1.2 安装docker及其依赖库

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

2.1.3 启动Docker,设置开机自启动

# 启动docker
systemctl start docker
# 设置docker开机启动
systemctl enable docker
# 验证
systemctl status docker

2.2 安装cri-dockerd

k8s 1.24版本后需要使用cri-dockerd和docker通信

2.2.1 下载cri-dockerd

# 若没有wget,则执行
yum install -y wget
# 下载
wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.4/cri-dockerd-0.3.4-3.el7.x86_64.rpm
# 安装
rpm -ivh cri-dockerd-0.3.4-3.el7.x86_64.rpm
# 重载系统守护进程
systemctl daemon-reload

2.2.2 设置镜像加速

tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://c12xt3od.mirror.aliyuncs.com"]
}
EOF

2.2.3 修改配置文件

修改第10行 ExecStart=
改为	ExecStart=/usr/bin/cri-dockerd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.7

vi /usr/lib/systemd/system/cri-docker.service

2.2.4 自启动、重启Docker组件

# 重载系统守护进程
systemctl daemon-reload
# 设置cri-dockerd自启动
systemctl enable cri-docker.socket cri-docker
# 启动cri-dockerd
systemctl start cri-docker.socket cri-docker
# 检查Docker组件状态
systemctl status docker cir-docker.socket cri-docker

显示:

3. 安装Kubernetes

3.1 安装kubectl(所有节点执行)

#  当前使用的是最新版本 v1.28.2
# 下载
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
#或者 v1.28.2
curl -LO "https://dl.k8s.io/release/v1.28.2/bin/linux/amd64/kubectl"
# 检验
curl -LO "https://dl.k8s.io/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl.sha256"
#或者 v1.28.2
curl -LO "https://dl.k8s.io/v1.28.2/bin/linux/amd64/kubectl.sha256"
echo "$(cat kubectl.sha256)  kubectl" | sha256sum --check
# 安装
install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
# 测试
kubectl version --client

3.2 安装kubeadm(所有节点执行)

# 改国内源
cat <<EOF | 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  
# 安装
yum install -y install kubeadm-1.28.2-0 kubelet-1.28.2-0 kubectl-1.28.2-0 --disableexcludes=kubernetes
# 设置自启动
systemctl enable --now kubelet
# 查看kubelet服务状态,执行完这一步还是未启动状态 接着向下执行,执行kube初始化之后生成配置文件会自动启动kubelet
systemctl status kubelet

3.3 安装runc(所有节点执行)

# 下载 runc.amd64  
wget https://github.com/opencontainers/runc/releases/download/v1.1.9/runc.amd64
# 安装
install -m 755 runc.amd64 /usr/local/bin/runc
# 验证
runc -v

3.4 部署集群

3.4.1 初始化集群(master节点执行)

# 执行 kubeadm  init 命令
kubeadm init  --node-name=k8s-master --image-repository=registry.aliyuncs.com/google_containers --cri-socket=unix:///var/run/cri-dockerd.sock --apiserver-advertise-address=192.168.175.133 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12

# 需要修改的参数
	--apiserver-advertise-address # 指定 API 服务器的广告地址、我设置为master节点的ip
	
# 初始化成功后运行下面的命令	
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

# master节点执行 配置文件的复制(为了在node节点可以使用kubectl相关命令)
scp /etc/kubernetes/admin.conf 192.168.175.134:/etc/kubernetes/
scp /etc/kubernetes/admin.conf 192.168.175.135:/etc/kubernetes/

# 到node节点检查admin.conf文件是否传输完成
ls /etc/kubernetes/
	admin.conf  manifests
# 将admin.conf加入环境变量,直接使用永久生效
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >>  ~/.bash_profile
# 加载
source ~/.bash_profile
	
# ---------------------------------加入集群-------------------------------------
# 1.在master节点执行 kubeadm init成功后,会出现 kubeadm join xxx xxx的命令,直接复制到node节点执行就好。
# 2.下面是若没有复制到kubeadm join的命令或者是想要在集群中加入新节点,
#   则先在master执行,获取token 和 discovery-token-ca-cert-hash。
#   获取 token 参数
		kubeadm token list   # 查看已有 token
		kubeadm token create # 没有token则执行,创建新的 TOKEN
#   获取 discovery-token-ca-cert-hash 参数 
		openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null |  openssl dgst -sha256 -hex | sed 's/^.* //'

# 3.node节点执行 kubeadm join
# 修改获取的 token 和 discovery-token-ca-cert-hash 后,再执行
    kubeadm join 192.168.175.133:6443 --token y8v2nc.ie2ovh1kxqtgppbo --discovery-token-ca-cert-hash sha256:1fa593d1bc58653afaafc9ca492bde5b8e40e9adef055e8e939d4eb34fb436bf --cri-socket unix:///var/run/cri-dockerd.sock

3.4.3 重新加入集群(node节点执行)

# 先执行
kubeadm reset --cri-socket unix:///var/run/cri-dockerd.sock
# 再获取TOKEN、discovery-token-ca-cert-hash 参数后,最后执行
kubeadm join 192.168.175.133:6443 --token y8v2nc.ie2ovh1kxqtgppbo --discovery-token-ca-cert-hash sha256:1fa593d1bc58653afaafc9ca492bde5b8e40e9adef055e8e939d4eb34fb436bf --cri-socket unix:///var/run/cri-dockerd.sock

3.4.4 安装网络插件下载然后运行

# 安装flannel
kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
# 查看安装结果
kubectl get pods --all-namespaces

3.5 测试kubernetes 集群

# 下面一般在master节点执行,若node节点可以使用kubectl命令,也可以在node节点上操作
kubectl get nodes
kubectl get pod -A		

3.5.1 使用nginx测试

# 配置文件
vi nginx-deployment.yaml
# 执行
kubectl apply -f nginx-deployment.yaml
# nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:latest
          ports:
            - containerPort: 80

---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
    - name: http 
      port: 80
      targetPort: 80
      nodePort: 30080
  type: NodePort

查看状态

kubectl get pod,svc |grep nginx

访问:http://192.168.175.133:30080/,出现这个页面就算大功告成!

部署过程故障

1、镜像拉取失败

问题表现:Pod 长时间处于Pending状态,描述信息中显示ImagePullBackOff。例如,执行kubectl describe pod <pod - name>命令后,在Events部分看到类似Failed to pull image "<image - name>": rpc error: code = Unknown desc = Error response from daemon: manifest for <image - name> not found的错误信息。

故障原因:原因是无法访问到镜像地址

故障处理:修改/etc/docker/daemon.json配置文件中的registry-mirrors地址

2、容器状态No Ready

问题表现:NODE节点状态显示为noready

故障原因:容器通信插件未安装成功

故障处理:重新安装容器通信插件、重启bukelet

3、pod节点状态显示未running

3.1、通过kubectl describe pod -n <ns> <pod name>命令查看Pod的事件,确认当前Pod中未启动的Init容器是否存在异常

3.2、通过kubectl logs -n <ns> <pod name> -c <container name>命令查看Pod中未启动的Init容器的日志,通过日志内容排查问题

3.3、查看Pod的配置,例如检查健康检查配置,进一步确认未启动的Init容器配置是否正常

4、kubeadm未启动成功

问题表现:systemctl 查看kubelet状态为未启动

问题原因:未进行kubeadm初始化、未生成配置文件

故障处理:执行kubeadm init初始化、随后自动生成配置文件、返回查看已启动成功