部署K8S 1.31 (containerd)

1、基础环境准备

当前国内无法访问docker.hub因此需要提前准备可以访问的镜像仓库

1、设备IP地址规划

名称IP地址系统
Master192.168.110.133Centos stream8
Slave01192.168.110.134Centos stream8
Slave02192.168.110.135Centos stream8

2、操作系统要求

# 1、关闭防火墙/SELINUX
ufw status 
ufw disabel

# 2、禁用selinux
sed -ri 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config 
setenforce 0

#3、关闭swap分区,K8S在使用CPU和内存为物理内存和CPU,Cgroup相关驱动无法对其进行有效管理
sed -ri 's/.*swap.*/#&/' /etc/fstab
swapoff -a   # 查查是否关闭swap分区

# 4、设置主机名称
vim /etc/hosts
192.168.110.133 Master
192.168.110.134 Slave01
192.168.110.135 Slave02

# 5、同步时间
#查看时区,时间
date
#先查看时区是否正常,不正确则替换为上海时区
timedatectl set-timezone Asia/Shanghai
#安装chrony,联网同步时间
apt install chrony -y && systemctl enable --now chronyd

# 6、配置桥接的IPV4流量传递到iptables的链
cat >> /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-iptables=1
net.ipv4.ip_forward=1
vm.swappiness=0
EOF
sysctl --system

# 7、服务器之间设置免密登录
ssh-keygen -t rsa
ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.110.131
ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.110.132

2、使用Kubeadm安装K8s(所有主机)

1、配置内核转发以及网桥过滤

# 创建加载内核模块 (主机启动后自动加载)
cat << EOF | tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

# 手动执行,加载模块
modprobe overlay
modprobe br_netfilter

# 查看以及已经加载模块
lsmod | egrep "overlay"
lsmod | egrep "br_netfilter"


# 添加网桥过滤以及内核转发配置文件
cat >> /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-iptables=1
net.ipv4.ip_forward=1
vm.swappiness=0
EOF

# 加载内核
sysctl --system

2、安装ipset 以及 ipvsadm


apt install ipset ipvsadm -y

cat << EOF | tee /etc/modules-load.d/ipvs.conf
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
ip_vs_sh
nf_conntrack
EOF

# 创建模块加载脚本
cat << EOF | tee ipvs.sh
#!/bin/sh
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- ip_conntrack
EOF

# 执行脚本,加载模块
sh ipvs.sh

3、容器运行时与containerd(所有主机)

1、安装containerd(二进制安装)

# 1、安装containerd
wget https://github.com/containerd/containerd/releases/download/v1.7.14/containerd-1.7.14-linux-amd64.tar.gz
tar xvf containerd-1.7.14-linux-amd64.tar.gz
#解压出来一个bin目录,containerd可执行文件都在bin目录里面 
mv bin/* /usr/local/bin/


wget https://github.com/containerd/containerd/releases/download/v1.7.22/cri-containerd-1.7.22-linux-amd64.tar.gz
tar xf cri-containerd-1.7.22-linux-amd64.tar.gz -C /

2、Containerd配置文件修改,并启动containerd

mkdir /etc/containerd
containerd config default > /etc/containerd/config.toml

# 修改配置文件,修改pause版本,1.29以后为3.9
vim /etc/containerd/config.toml
sandbox_image = "registry.k8s.io/pause:3.9"

# 修改镜像仓库地址
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"

# 修改指定内核驱动为Cgroup,139行,修改runc中的配置
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true

#启动containerd
systemctl enabled --now containerd

4、K8S集群部署(所有主机)

1、下载安装文件


sudo apt-get update
# apt-transport-https 可能是一个虚拟包(dummy package);如果是的话,你可以跳过安装这个包
sudo apt-get install -y apt-transport-https ca-certificates curl gpg

curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.31/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

# 添加kubernetes仓库
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.31/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
# 镜像仓库
apt-get update && apt-get install -y apt-transport-https
curl -fsSL https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.31/deb/Release.key |
    gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.31/deb/ /" |
    tee /etc/apt/sources.list.d/kubernetes.list
apt-get update
apt-get install -y kubelet kubeadm kubectl


# 获取版本
apt-cache madison kubeadm
# 安装指定版本
apt install -y kubelet=1.31.0-00 kubeadm=1.31.0-00 kubectl=1.31.0-00
#安装最新版本

# 安装最新版本,并锁定版本
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
#锁定版本
sudo apt-mark hold kubelet kubeadm kubectl
# 取消版本锁定
sudo apt-mark unhold kubelet kubeadm kubectl




2、配置Kubelet

# 为了实现容器运行时使用cgroupdrive与kubelet使用的cgroup的一致性
vim /etc/default/kubelet
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"

# 设置kubelet为开机自启动,由于当前没有生成配置文件,集群初始化后自启动
systemctl enable kubelet

3、Master准备初始化配置文件

1、通过kubeadm-config文件在线初始化

# 生成配置文件模板
kubeadm  config print init-defaults > kubeadm-config.yaml

# 修改yaml文件
vim kubeadm-config.yaml
advertiseAddress: 192.168.110.130
name: Master
serviceSubnet: 10.96.0.0/12
podSubnet: 10.244.0.0/16
# 使用阿里云镜像仓库
# imageRepository: registry.aliyuncs.com/google_containers (如果不能直接拉去镜像的)

#查看指定版本的镜像
kubeadm config images list --kubernetes-version=v1.31.0
registry.k8s.io/kube-apiserver:v1.31.1
registry.k8s.io/kube-controller-manager:v1.31.1
registry.k8s.io/kube-scheduler:v1.31.1
registry.k8s.io/kube-proxy:v1.31.1
registry.k8s.io/coredns/coredns:v1.11.3
registry.k8s.io/pause:3.10
registry.k8s.io/etcd:3.5.15-0
# 使用阿里云镜像仓库
kubeadm  config images list --kubernetes-version=v1.31.1 --image-repository=registry.aliyuncs.com/google_containers
registry.aliyuncs.com/google_containers/kube-apiserver:v1.31.1
registry.aliyuncs.com/google_containers/kube-controller-manager:v1.31.1
registry.aliyuncs.com/google_containers/kube-scheduler:v1.31.1
registry.aliyuncs.com/google_containers/kube-proxy:v1.31.1
registry.aliyuncs.com/google_containers/coredns:v1.11.3
registry.aliyuncs.com/google_containers/pause:3.10
registry.aliyuncs.com/google_containers/etcd:3.5.15-0

#下载镜像
kubeadm  config images pull --kubernetes-version=v1.31.1
#下载镜像(指定仓库)
kubeadm  config images pull --kubernetes-version=v1.31.1 --image-repository=registry.aliyuncs.com/google_containers
#crictl /crt images 查看下载的镜像
ctr -n=k8s.io images list

#从国内镜像拉取
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.23.8
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.23.8
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.23.8
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.23.8
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.1-0
docker pull coredns/coredns:1.8.6
#重新打标签
#将拉取下来的images重命名为kubeadm config所需的镜像名字
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.23.8 k8s.gcr.io/kube-apiserver:v1.23.8
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.23.8 k8s.gcr.io/kube-controller-manager:v1.23.8
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.23.8 k8s.gcr.io/kube-scheduler:v1.23.8
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.23.8 k8s.gcr.io/kube-proxy:v1.23.8
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6 k8s.gcr.io/pause:3.6
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.1-0 k8s.gcr.io/etcd:3.5.1-0
docker tag coredns/coredns:1.8.6 k8s.gcr.io/coredns/coredns:v1.8.6

#使用部署文件出书化K8S集群
kubeadm init --config kubeadm-config.yaml --upload-certs --v=9

# 命令初始化集群
kubeadm init --apiserver-advertise-address=192.168.110.137  --image-repository=registry.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16 --service-cidr=10.92.0.0/16  --v=5  # 简化
----------------------------------------------------------------------
kubeadm init --apiserver-advertise-address=192.168.110.133 --control-plane-endpoint=control-plane-endpoint.k8s.local --image-repository=registry.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --service-dns-domain=k8s.local --upload-certs --v=5 # 完整

然后按照系统提示指导部署集群

2、使用kubeadm init 离线初始化

# 当有本地无法联网时,使用该初始化方式
1、远端主机获取对应K8S版本的包
# 查看K8S版本的组件
kubeadm config images list --kubernetes-version=v1.31.0
registry.k8s.io/kube-apiserver:v1.31.1
registry.k8s.io/kube-controller-manager:v1.31.1
registry.k8s.io/kube-scheduler:v1.31.1
registry.k8s.io/kube-proxy:v1.31.1
registry.k8s.io/coredns/coredns:v1.11.3
registry.k8s.io/pause:3.10
registry.k8s.io/etcd:3.5.15-0

2、拉取镜像
docker pull kube-apiserver:v1.23.8
docker pull kube-controller-manager:v1.23.8
docker pull kube-scheduler:v1.23.8
docker pull kube-proxy:v1.23.8
docker pull pause:3.6
docker pull etcd:3.5.1-0
docker pull coredns/coredns:1.8.6
# 指定国内仓库
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.23.8
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.23.8
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.23.8
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.23.8
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.1-0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containerscoredns/coredns:1.8.6

3、远端主机将镜像保存
docker save -o kube-apiserver-v1.31.1.tar k8s.gcr.io/kube-apiserver:v1.31.1
docker save -o kube-controller-manager-v1.31.1.tar k8s.gcr.io/kube-controller-manager:v1.31.1
docker save -o kube-scheduler-v1.31.1.tar k8s.gcr.io/kube-scheduler:v1.31.1
docker save -o kube-proxy-v1.31.1.tar k8s.gcr.io/kube-proxy:v1.31.1
docker save -o pause-3.6.tar k8s.gcr.io/pause:3.6
docker save -o etcd-3.5.4-0.tar k8s.gcr.io/etcd:3.5.4-0
docker save -o coredns-v1.9.3.tar k8s.gcr.io/coredns/coredns:v1.9.3

4、使用scp或其他方式将tar包同步到本地主机
scp  kube-apiserver-v1.31.1.tar            root@192.168.110.138:/root/
scp  kube-controller-manager-v1.31.1.tar   root@192.168.110.138:/root/
scp  kube-scheduler-v1.31.1.tar            root@192.168.110.138:/root/
scp  kube-proxy-v1.31.1.tar                root@192.168.110.138:/root/
scp  pause-3.6.tar                         root@192.168.110.138:/root/
scp  etcd-3.5.4-0.tar                      root@192.168.110.138:/root/
scp  coredns-v1.9.3.tar                    root@192.168.110.138:/root/

5、本机主机导入镜像
ctr -n=k8s.io images import /path/to/save/kube-apiserver-v1.31.1.tar
ctr -n=k8s.io images import /path/to/save/kube-controller-manager-v1.31.1.tar
ctr -n=k8s.io images import /path/to/save/kube-scheduler-v1.31.1.tar
ctr -n=k8s.io images import /path/to/save/kube-proxy-v1.31.1.tar
ctr -n=k8s.io images import /path/to/save/pause-3.6.tar
ctr -n=k8s.io images import /path/to/save/etcd-3.5.4-0.tar
ctr -n=k8s.io images import /path/to/save/coredns-v1.9.3.tar

6、查看镜像是否导入
ctr -n=k8s.io images list

7、指定初始化文件,进行初始化
kubeadm  config print init-defaults > kubeadm-config.yaml

# 修改yaml文件
vim kubeadm-config.yaml
advertiseAddress: 192.168.110.130
name: Master
serviceSubnet: 10.96.0.0/12
podSubnet: 10.244.0.0/16
controlPlaneEndpoint: "LOAD_BALANCER_DNS:LOAD_BALANCER_PORT"  # 负载均衡配置,按需配置替换为负载均衡器的 DNS 名称或 IP 地址,将 LOAD_BALANCER_PORT 替换为负载均衡器监听的端口(通常是 6443)。
imageRepository: localhost:5000   # 指定本地镜像

kubeadm init --config kubeadm-config.yaml --upload-certs --v=9

# 如果直接使用registry.k8s.io仓库下载,使用命令初始化
kubeadm init --apiserver-advertise-address=192.168.110.137   --pod-network-cidr=10.244.0.0/16 --service-cidr=10.92.0.0/16  --v=5
#如果是使用阿里云registry.aliyuncs.com/google_containers镜像仓库下载
kubeadm init --apiserver-advertise-address=192.168.110.137  --image-repository=registry.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16 --service-cidr=10.92.0.0/16  --v=5

5、部署网络插件

1、在线标准化部署calico

# 1、通过yaml文件部署
wget https://docs.projectcalico.org/manifests/calico.yaml
kubectl apply -f /root/calico.yaml

# 2、查看状态
kubectl get pods -n kube-system

[root@Master01-Centos8 ~]# kubectl get pods -n kube-system
NAME                                       READY   STATUS    RESTARTS   AGE
calico-kube-controllers-b8d8894fb-nmznx    1/1     Running   0          106m
calico-node-fn5q8                          1/1     Running   0          106m
calico-node-fn7rl                          1/1     Running   0          106m
calico-node-tkngk                          1/1     Running   0          106m
coredns-855c4dd65d-66vmm                   1/1     Running   0          42h
coredns-855c4dd65d-9779h                   1/1     Running   0          42h
etcd-master01-centos8                      1/1     Running   0          42h
kube-apiserver-master01-centos8            1/1     Running   0          42h
kube-controller-manager-master01-centos8   1/1     Running   0          42h
kube-proxy-5bprr                           1/1     Running   0          42h
kube-proxy-6dnm2                           1/1     Running   0          42h
kube-proxy-9d8gc                           1/1     Running   0          42h
kube-scheduler-master01-centos8            1/1     Running   0          42h

2、离线标准化部署calico

# 当本地主机无法直接访问互联网时使用
1、远端主机下载calico组件(假设远端主机有docker)
docker pull calico/cni:v3.28.2
docker pull calico/pod2daemon-flexvol:v3.28.2
docker  pull calico/node:v3.28.2
docker  pull calico/kube-controllers:v3.28.2
docker  pull calico/typha:v3.28.2

2、将镜像保存到本地
docker save  -o calico-cni-v3.28.2.tar calico/cni:v3.28.2
docker save  -o calico-pod2daemon-flexvol-v3.28.2.tar calico/pod2daemon-flexvol:v3.28.2
docker save  -o calico-node-v3.28.2.tar calico/node:v3.28.2
docker save  -o calico-kube-controllers-v3.28.2.tar calico/kube-controllers:v3.28.2
docker save  -o calico-typha-v3.28.2.tar calico/typha:v3.28.2

3、将镜像拷贝到本地主机(需要手动导入集群中所有主机)
scp  calico-cni-v3.28.2.tar                   root@192.168.110.138:/root/
scp  calico-pod2daemon-flexvol-v3.28.2.tar    root@192.168.110.138:/root/
scp  calico-node-v3.28.2.tar                  root@192.168.110.138:/root/
scp  calico-kube-controllers-v3.28.2.tar      root@192.168.110.138:/root/
scp  calico-typha-v3.28.2.tar                 root@192.168.110.138:/root/

4、将镜像导入本地主机(需要手动导入集群中所有主机)
ctr -n=k8s.io image import /root/calico-cni-v3.28.2.tar
ctr -n=k8s.io image import /root/calico-pod2daemon-flexvol-v3.28.2.tar
ctr -n=k8s.io image import /root/calico-node-v3.28.2.tar
ctr -n=k8s.io image import /root/calico-kube-controllers-v3.28.2.tar
ctr -n=k8s.io image import /root/calico-typha-v3.28.2.tar

#查看镜像是否导入(所有主机上都执行)
ctr -n=k8s.io images list  | grep calico

5、安装calico(master上执行)
kubectl apply -f /root/calico.yaml

6、查看状态
[root@Master01-Centos8 ~]# kubectl get nodes
NAME               STATUS   ROLES           AGE   VERSION
master01-centos8   Ready    control-plane   42h   v1.31.1
slave01-centos8    Ready    <none>          42h   v1.31.1
slave02-centos8    Ready    <none>          42h   v1.31.1
[root@Master01-Centos8 ~]# kubectl get pods -n kube-system
NAME                                       READY   STATUS    RESTARTS   AGE
calico-kube-controllers-b8d8894fb-nmznx    1/1     Running   0          114m
calico-node-fn5q8                          1/1     Running   0          114m
calico-node-fn7rl                          1/1     Running   0          114m
calico-node-tkngk                          1/1     Running   0          114m
coredns-855c4dd65d-66vmm                   1/1     Running   0          42h
coredns-855c4dd65d-9779h                   1/1     Running   0          42h
etcd-master01-centos8                      1/1     Running   0          42h
kube-apiserver-master01-centos8            1/1     Running   0          42h
kube-controller-manager-master01-centos8   1/1     Running   0          42h
kube-proxy-5bprr                           1/1     Running   0          42h
kube-proxy-6dnm2                           1/1     Running   0          42h
kube-proxy-9d8gc                           1/1     Running   0          42h
kube-scheduler-master01-centos8            1/1     Running   0          42h

在任何节点执行kubectl命令

1、将master节点中 /etc/kubernetes/admin.conf   复制需要运行的主机的 /etc/kubernetes中

2、对应主机上配置环境变量
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile

6、安装dashboard

1、安装helm

1、二进制安装helm

wget https://get.helm.sh/helm-v3.16.0-linux-amd64.tar.gz
tar -zxvf helm-v3.16.0-linux-amd64.tar.gz
mv linux-amd64/helm /usr/local/bin/helm
helm repo add bitnami https://charts.bitnami.com/bitnami

2、deb包安装helm

# 确保目录存在
sudo mkdir -p /usr/share/keyrings 
# 下载、转换并保存 GPG 签名文件 
curl https://baltocdn.com/helm/signing.asc | gpg --dearmor | sudo tee /usr/share/keyrings/helm.gpg > /dev/null 
# 验证 GPG 签名 gpg --list-keys --keyring /usr/share/keyrings/helm.gpg

sudo apt-get install apt-transport-https --yes
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/helm.gpg] https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list
sudo apt-get update
udo apt-get install helm

3、用脚本安装helm

curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
 chmod 700 get_helm.sh
./get_helm.sh

2、安装dashboard

# Add kubernetes-dashboard repository
# helm repo add kubernetes-dashboard https://kubernetes.github.io/dashboard/
helm repo add bitnami https://charts.bitnami.com/bitnami  # 建议使用
# Deploy a Helm Release named "kubernetes-dashboard" using the kubernetes-dashboard chart
helm upgrade --install kubernetes-dashboard kubernetes-dashboard/kubernetes-dashboard --create-namespace --namespace kubernetes-dashboard
# 卸载
helm delete kubernetes-dashboard --namespace kubernetes-dashboard


3、使用dashboard

#需要提前确保kubernetes-dashboard命名空间已经存在,确定cluster-admin ClusterRole 存在
# kubectl create namespace kubernetes-dashboard
1、创建ServiceAccount 和一个 ClusterRoleBinding
vim dashboard-adminuser.yaml 
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kubernetes-dashboard
# 创建
kubectl apply -f dashboard-adminuser.yaml
# 验证创建情况
kubectl get serviceaccount admin-user -n kubernetes-dashboard 
kubectl get clusterrolebinding admin-user

2、ServiceAccount获取token

# 获取简单的token
kubectl -n kubernetes-dashboard create token admin-user

# 获取长期token,需要修改dashbord-adminuser.yaml文件
apiVersion: v1
kind: Secret
metadata:
  name: admin-user
  namespace: kubernetes-dashboard
  annotations:
    kubernetes.io/service-account.name: "admin-user"   
type: kubernetes.io/service-account-token  

7 安装kubesphere

helm upgrade --install -n kubesphere-system   --set global.imageRegistry=swr.cn-southwest-2.myhuaweicloud.com/ks  --create-namespace ks-core https://charts.kubesphere.io/main/ks-core-1.1.1.tgz --debug --wait

# 如果可以直接拉取镜像
helm upgrade --install -n kubesphere-system --create-namespace ks-core https://charts.kubesphere.io/main/ks-core-1.1.1.tgz --debug --wait


# 等待一会儿安装完成
http://192.168.110.137:30880
<think>我们当前的目标是在银河麒麟V10 SP2 x86_64架构上离线安装Kubernetes 1.31高可用集群。由于是离线环境,我们需要预先下载所有必要的软件包和依赖,并配置本地仓库。同时,考虑到生产环境的高可用性,我们将采用多主节点架构。 步骤概述: 1. 准备阶段:系统配置、依赖检查、防火墙和SELinux设置。 2. 离线资源准备:下载Kubernetes 1.31及相关组件(containerd, runc, cni-plugins, etcd, coredns等)的离线包,以及银河麒麟V10 SP2的依赖包。 3. 配置本地仓库:使用HTTP服务器或FTP服务提供离线包,配置节点的yum源指向本地仓库。 4. 安装容器运行时(containerd):配置containerd,使用systemd作为cgroup driver。 5. 安装kubeadm, kubelet, kubectl:通过本地仓库安装指定版本。 6. 初始化第一个控制平面节点:使用kubeadm初始化集群,配置高可用(使用外部etcd集群或内置etcd集群,这里我们使用内置etcd集群的多主模式)。 7. 加入其他控制平面节点和工作节点。 8. 安装网络插件(如Calico、Flannel等),这里选择Calico。 9. 验证集群高可用性。 注意:由于是离线环境,我们需要提前下载所有镜像并导入到各个节点。 详细步骤: 1. 系统准备(所有节点执行) - 设置主机名和hosts文件(确保每个节点有唯一的主机名,并且能够互相解析) - 关闭防火墙(或配置必要的端口) - 禁用SELinux(或设置为permissive模式) - 关闭swap - 配置内核参数(加载必要的内核模块,开启ipvs) - 确保时间同步 2. 离线资源准备(在一台可联网的机器上操作) - 下载Kubernetes 1.31的二进制文件(kubeadm, kubelet, kubectl)以及依赖的RPM包(包括银河麒麟V10 SP2的依赖包) - 下载容器运行时(containerd)及其依赖 - 下载Kubernetes所需的镜像(使用`kubeadm config images list`列出镜像,然后使用dockercontainerd工具下载并导出) - 下载网络插件(Calico)的镜像和manifest文件 3. 配置本地仓库(使用HTTP服务) - 将下载的RPM包放入仓库目录,创建repodata - 启动HTTP服务(如nginx或apache) - 在所有节点上配置yum源指向该仓库 4. 安装容器运行时(containerd)(所有节点) - 通过本地仓库安装containerd - 配置containerd,设置cgroup driver为systemd - 启动containerd服务 5. 安装kubeadm, kubelet, kubectl(所有节点) - 通过本地仓库安装指定版本(1.31.x) 6. 初始化第一个控制平面节点 - 使用kubeadm生成默认配置文件,修改必要参数(如advertiseAddress,podSubnet,imageRepository为本地镜像仓库地址(如果有)或者跳过镜像拉取,因为我们已提前导入镜像) - 配置高可用:使用多主模式,需要配置负载均衡器(如haproxy+keepalived)或者使用内置的kube-vip。这里为了简化,我们使用内置的etcd集群,并先初始化第一个节点,然后加入其他控制节点。 - 初始化命令:`kubeadm init --config=kubeadm-config.yaml`,其中配置文件包含高可用相关配置。 7. 加入其他控制平面节点和工作节点 - 根据初始化输出的join命令加入节点(控制平面节点需要带`--control-plane`参数) 8. 安装Calico网络插件 - 使用离线下载的Calico manifest文件,修改其中的镜像地址为本地镜像(或提前导入镜像),然后应用。 9. 验证集群 - 检查节点状态,pod状态,以及高可用测试。 由于步骤复杂,我们将编写一个脚本来自动化执行。但是请注意,生产环境需要谨慎,建议分步执行并验证。 下面是一个详细的安装步骤和脚本框架。由于篇幅限制,我们不会写出完整的脚本,但会给出关键步骤和代码片段,并注释说明。 由于是离线安装,我们假设已经将所有的离线包(包括RPM包和镜像)下载并放置在了离线环境的特定目录中。 步骤1:系统准备(所有节点执行) ```bash #!/bin/bash # 设置主机名,例如: # hostnamectl set-hostname master1 # 关闭防火墙 systemctl stop firewalld systemctl disable firewalld # 关闭SELinux setenforce 0 sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config # 关闭swap swapoff -a sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab # 配置内核参数 cat > /etc/modules-load.d/k8s.conf <<EOF br_netfilter ip_vs ip_vs_rr ip_vs_wrr ip_vs_sh nf_conntrack EOF modprobe br_netfilter modprobe ip_vs modprobe ip_vs_rr modprobe ip_vs_wrr modprobe ip_vs_sh modprobe nf_conntrack cat > /etc/sysctl.d/k8s.conf <<EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 vm.swappiness=0 EOF sysctl --system # 确保时间同步 yum install -y ntpdate ntpdate ntp.aliyun.com ``` 步骤2:离线资源准备(在可联网机器上操作) 由于Kubernetes 1.31是最新版本,我们需要从官方获取二进制文件和镜像。 2.1 下载二进制文件 从以下地址下载: - kubeadm, kubelet, kubectl: https://dl.k8s.io/v1.31.0/bin/linux/amd64/ 注意:银河麒麟V10 SP2基于CentOS,因此需要下载对应的RPM包或者二进制文件。这里我们使用二进制文件。 2.2 下载containerd 从https://github.com/containerd/containerd/releases 下载最新版本的containerd二进制包(例如containerd-1.7.0-linux-amd64.tar.gz)和runc(https://github.com/opencontainers/runc/releases) 2.3 下载cni-plugins 从https://github.com/containernetworking/plugins/releases 下载 2.4 下载kubeadm所需的镜像 使用以下命令列出镜像: kubeadm config images list --kubernetes-version v1.31.0 然后使用dockercontainerd下载这些镜像。由于是离线,我们可以在有网络的机器上使用docker下载,然后导出为tar文件。 2.5 下载Calico的manifest和镜像 从https://docs.projectcalico.org/manifests/calico.yaml 下载yaml文件,并解析其中的镜像,同样在有网络的机器上下载。 步骤3:配置本地仓库(在离线环境中的仓库服务器上) 假设我们将所有RPM包放在/data/repo目录下,然后使用createrepo创建仓库。 注意:银河麒麟V10 SP2的默认yum源可能包含一些依赖包,我们需要将这些依赖包也下载下来。 我们可以使用yumdownloader工具在有网络的银河麒麟V10 SP2机器上下载所有依赖的RPM包(包括kubeadm, kubelet, kubectl, containerd, etc.)及其依赖。 例如: ```bash # 在有网络的机器上 yum install yum-utils createrepo -y mkdir -p /data/repo cd /data/repo # 下载kubeadm, kubelet, kubectl的RPM包(注意:官方不提供RPM包,我们可以从阿里云镜像下载,或者自己构建。这里我们使用二进制文件,所以不下载RPM包?) # 但是为了简化,我们选择使用二进制文件安装kubeadm, kubelet, kubectl,而containerd和依赖包使用RPM。 # 下载containerd的RPM包(如果官方没有提供,可以下载二进制文件,然后自己制作RPM包,或者直接使用二进制文件安装) # 这里我们选择直接使用二进制文件安装containerd,所以只需要下载依赖的RPM包(如libseccomp等) # 因此,我们只需要创建银河麒麟V10 SP2的base仓库,并将系统已有的包复制出来作为本地仓库?或者使用安装镜像作为仓库。 # 更简单的方法:直接使用银河麒麟V10 SP2的安装镜像作为本地仓库,然后额外添加一个目录存放Kubernetes相关的RPM包(如果有的话)和我们下载的依赖包。 # 由于Kubernetes的二进制文件(kubeadm, kubelet, kubectl)官方不提供RPM包,我们将使用二进制安装,所以不需要RPM包。 # 因此,本地仓库主要提供系统依赖包(如socat, conntrack, ebtables, ipset, ipvsadm等)以及containerd的依赖。 # 使用yumdownloader下载这些依赖: repotrack -a x86_64 -p /data/repo ipvsadm ntpdate socat conntrack-tools ebtables ipset # 然后创建仓库 createrepo /data/repo # 将整个/data/repo目录复制到离线环境的仓库服务器上,并启动HTTP服务(例如使用Python的SimpleHTTPServer) # 在仓库服务器上: cd /data/repo python3 -m http.server 80 ``` 步骤4:配置所有节点的yum源 ```bash # 在离线环境的所有节点上 cat > /etc/yum.repos.d/local.repo <<EOF [local] name=local baseurl=http://<仓库服务器IP>/ enabled=1 gpgcheck=0 EOF # 然后安装依赖包 yum install -y ipvsadm socat conntrack ebtables ipset ntpdate ``` 步骤5:安装containerd(所有节点) 将之前下载的containerd二进制包(containerd-1.7.0-linux-amd64.tar.gz)和runc二进制文件复制到各个节点。 ```bash # 解压containerd tar Cxzvf /usr/local containerd-1.7.0-linux-amd64.tar.gz # 安装runc install -m 755 runc.amd64 /usr/local/sbin/runc # 生成containerd配置文件 mkdir -p /etc/containerd containerd config default | tee /etc/containerd/config.toml # 修改配置文件,使用systemd cgroup driver sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml # 创建systemd unit文件 cat > /etc/systemd/system/containerd.service <<EOF [Unit] Description=containerd container runtime Documentation=https://containerd.io After=network.target local-fs.target [Service] ExecStartPre=-/sbin/modprobe overlay ExecStart=/usr/local/bin/containerd Type=notify Delegate=yes KillMode=process Restart=always RestartSec=5 LimitNPROC=infinity LimitCORE=infinity LimitNOFILE=1048576 TasksMax=infinity OOMScoreAdjust=-999 [Install] WantedBy=multi-user.target EOF # 启动containerd systemctl daemon-reload systemctl enable --now containerd ``` 步骤6:安装kubeadm, kubelet, kubectl(所有节点) 将下载的二进制文件复制到/usr/bin目录下,并设置权限。 ```bash cp kubeadm kubelet kubectl /usr/bin/ chmod +x /usr/bin/kubeadm /usr/bin/kubelet /usr/bin/kubectl # 创建kubelet的systemd服务文件 cat > /etc/systemd/system/kubelet.service <<EOF [Unit] Description=kubelet: The Kubernetes Node Agent Documentation=https://kubernetes.io/docs/home/ [Service] ExecStart=/usr/bin/kubelet Restart=always StartLimitInterval=0 RestartSec=10 [Install] WantedBy=multi-user.target EOF # 创建kubelet的配置文件目录 mkdir -p /etc/kubernetes /etc/systemd/system/kubelet.service.d # 启动kubelet systemctl enable --now kubelet ``` 步骤7:导入镜像(所有节点) 将之前下载的镜像tar文件复制到各个节点,然后导入到containerd中。 例如,我们在每个节点上执行: ```bash for image in $(ls /path/to/images/*.tar); do ctr -n=k8s.io images import $image done ``` 步骤8:初始化第一个控制平面节点 准备kubeadm配置文件(kubeadm-config.yaml): ```yaml apiVersion: kubeadm.k8s.io/v1beta3 kind: InitConfiguration localAPIEndpoint: advertiseAddress: "本节点IP" bindPort: 6443 nodeRegistration: criSocket: "unix:///run/containerd/containerd.sock" imagePullPolicy: IfNotPresent taints: [] kubeletExtraArgs: cgroup-driver: "systemd" --- apiVersion: kubeadm.k8s.io/v1beta3 kind: ClusterConfiguration kubernetesVersion: v1.31.0 networking: podSubnet: "10.244.0.0/16" # 与Calico的默认配置一致,如果使用其他网络插件需修改 serviceSubnet: "10.96.0.0/12" controlPlaneEndpoint: "负载均衡器IP:6443" # 高可用集群需要配置负载均衡器(VIP),这里假设已经配置好,VIP为192.168.100.100 apiServer: extraArgs: authorization-mode: "Node,RBAC" timeoutForControlPlane: 5m0s imageRepository: "" # 使用本地镜像,所以这里为空,因为我们已经提前导入镜像 dns: {} etcd: local: dataDir: /var/lib/etcd --- # 开启ipvs模式 apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration mode: ipvs ``` 注意:高可用集群需要配置负载均衡器,可以使用haproxy+keepalived或者kube-vip等方案。由于是生产环境,我们使用haproxy+keepalived(需要至少两个控制平面节点)。 在第一个控制平面节点上执行: ```bash kubeadm init --config=kubeadm-config.yaml --upload-certs ``` 初始化成功后,按照输出提示,配置kubectl: ```bash mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config ``` 步骤9:加入其他控制平面节点 使用初始化时输出的命令,例如: ```bash kubeadm join 192.168.100.100:6443 --token ... --discovery-token-ca-cert-hash ... --control-plane --certificate-key ... ``` 步骤10:安装Calico网络插件 将之前下载的calico.yaml复制到控制平面节点,然后应用: ```bash kubectl apply -f calico.yaml ``` 步骤11:验证集群 检查节点状态: ```bash kubectl get nodes ``` 检查所有pod是否正常运行: ```bash kubectl get pods -A ``` 高可用测试:关闭一个控制平面节点,观察集群是否仍然可用。 由于步骤非常复杂,建议编写详细的脚本,并分步执行。每个步骤都需要严格的错误检查。 考虑到生产环境,建议在部署前详细阅读官方文档,并进行充分测试。 注意:以上步骤基于银河麒麟V10 SP2 x86_64架构,Kubernetes版本1.31.0。由于版本更新较快,具体细节可能需调整。 由于篇幅限制,无法提供完整的脚本,但以上步骤和代码片段可以作为基础。实际部署时,需要根据环境调整IP地址、版本号等参数。 相关问题: 1. 如何配置高可用的负载均衡器(haproxy+keepalived)? 2. 在银河麒麟V10 SP2上离线安装containerd有哪些注意事项? 3. 如何更新离线环境中的Kubernetes集群?</think>### 银河麒麟V10 SP2 x86_64离线部署Kubernetes 1.31高可用集群指南 #### 一、环境准备(所有节点执行) ```bash #!/bin/bash # 1. 关闭防火墙和SELinux systemctl stop firewalld && systemctl disable firewalld setenforce 0 sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config # 2. 关闭swap swapoff -a sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab # 3. 加载内核模块 cat > /etc/modules-load.d/k8s.conf <<EOF br_netfilter ip_vs ip_vs_rr ip_vs_wrr ip_vs_sh nf_conntrack EOF modprobe -- ip_vs modprobe -- ip_vs_rr modprobe -- ip_vs_wrr modprobe -- ip_vs_sh modprobe -- nf_conntrack # 4. 内核参数优化 cat > /etc/sysctl.d/k8s.conf <<EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 vm.swappiness=0 EOF sysctl --system ``` #### 二、离线资源准备(需联网设备) ```bash #!/bin/bash K8S_VER="v1.31.0" ARCH="amd64" # 1. 下载Kubernetes组件 wget https://dl.k8s.io/$K8S_VER/bin/linux/$ARCH/{kubeadm,kubelet,kubectl} wget https://github.com/containernetworking/plugins/releases/download/v1.4.0/cni-plugins-linux-$ARCH-v1.4.0.tgz # 2. 下载容器运行时 containerd_url="https://github.com/containerd/containerd/releases/download/v1.7.13/containerd-1.7.13-linux-$ARCH.tar.gz" runc_url="https://github.com/opencontainers/runc/releases/download/v1.1.12/runc.$ARCH" wget $containerd_url wget $runc_url # 3. 下载依赖RPM包(银河麒麟V10 SP2) repotrack -p ./rpms ipvsadm ntpdate socat conntrack-tools ebtables ipset # 4. 拉取K8s镜像 kubeadm config images list --kubernetes-version $K8S_VER | xargs -I{} docker pull {} docker save $(kubeadm config images list --kubernetes-version $K8S_VER) -o k8s-images-$K8S_VER.tar # 5. 创建离线资源包 tar czvf offline-k8s-$K8S_VER.tar.gz kube* cni-* containerd* runc.* rpms/ k8s-images-*.tar ``` #### 三、离线环境配置(所有节点) ```bash #!/bin/bash # 1. 创建本地仓库 mkdir -p /opt/k8s-offline tar xzvf offline-k8s-v1.31.0.tar.gz -C /opt/k8s-offline # 2. 配置YUM仓库 cat > /etc/yum.repos.d/local.repo <<EOF [local] name=Local Repository baseurl=file:///opt/k8s-offline/rpms enabled=1 gpgcheck=0 EOF # 3. 安装依赖 yum install -y ipvsadm socat conntrack ebtables ipset ntpdate # 4. 安装容器运行时 tar Cxzvf /usr/local /opt/k8s-offline/containerd-*.tar.gz install -m 755 /opt/k8s-offline/runc.* /usr/local/sbin/runc # 5. 配置containerd mkdir -p /etc/containerd containerd config default | tee /etc/containerd/config.toml sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml # 6. 启动containerd systemctl daemon-reload systemctl enable --now containerd # 7. 安装Kubernetes组件 install /opt/k8s-offline/kube* /usr/bin/ chmod +x /usr/bin/{kubeadm,kubelet,kubectl} # 8. 导入K8s镜像 docker load -i /opt/k8s-offline/k8s-images-v1.31.0.tar # 9. 配置kubelet服务 cat > /etc/systemd/system/kubelet.service.d/10-kubeadm.conf <<EOF [Service] Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf" Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml" EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env ExecStart= ExecStart=/usr/bin/kubelet \$KUBELET_KUBECONFIG_ARGS \$KUBELET_CONFIG_ARGS \$KUBELET_KUBEADM_ARGS \$KUBELET_EXTRA_ARGS --cgroup-driver=systemd EOF systemctl enable --now kubelet ``` #### 四、高可用集群初始化(控制平面节点) ```bash #!/bin/bash # 1. 生成kubeadm配置模板 kubeadm config print init-defaults > kubeadm-init.yaml # 2. 修改配置文件(重要参数) sed -i 's/advertiseAddress: 1.2.3.4/advertiseAddress: 192.168.1.100/' kubeadm-init.yaml sed -i 's/name: node/name: master1/' kubeadm-init.yaml sed -i 's/kubernetesVersion: .*/kubernetesVersion: v1.31.0/' kubeadm-init.yaml sed -i '/dns:/a \ podSubnet: "10.244.0.0/16"' kubeadm-init.yaml # 添加高可用配置 cat >> kubeadm-init.yaml <<EOF controlPlaneEndpoint: "k8s-vip:6443" apiServer: certSANs: - "k8s-vip" - "192.168.1.100" - "192.168.1.101" - "192.168.1.102" --- apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration mode: "ipvs" EOF # 3. 初始化第一个控制节点 kubeadm init --config=kubeadm-init.yaml --upload-certs | tee kubeadm-init.log # 4. 配置kubectl mkdir -p $HOME/.kube cp -i /etc/kubernetes/admin.conf $HOME/.kube/config chown $(id -u):$(id -g) $HOME/.kube/config # 5. 安装Calico网络插件 kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.27.0/manifests/calico.yaml ``` #### 五、高可用控制平面扩展 ```bash #!/bin/bash # 1. 获取加入命令(从第一个控制节点) JOIN_CMD=$(kubeadm token create --print-join-command) CERT_KEY=$(kubeadm init phase upload-certs --upload-certs | tail -1) # 2. 其他控制节点加入(示例) kubeadm join k8s-vip:6443 \ --token ${JOIN_CMD##* } \ --discovery-token-ca-cert-hash sha256:xxxxxxxx \ --control-plane \ --certificate-key $CERT_KEY ``` #### 六、工作节点加入 ```bash # 使用第一个控制节点生成的join命令 kubeadm join k8s-vip:6443 \ --token xxxxxx.xxxxxxxxxxxx \ --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxx ``` #### 七、验证集群状态 ```bash kubectl get nodes -o wide kubectl get pods -A -o wide kubectl get ep -A # 验证高可用端点 ipvsadm -Ln # 验证IPVS规则 ``` ### 关键安全配置 1. **证书SAN扩展**:在kubeadm配置中添加所有控制节点IP和VIP到`certSANs` 2. **RBAC强化**:启用`NodeRestriction`准入控制器 3. **Pod安全策略**:使用PodSecurityPolicy或PodSecurity标准 4. **网络策略**:启用Calico网络策略 ```yaml # 示例网络策略:拒绝所有默认流量 apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: default-deny spec: podSelector: {} policyTypes: - Ingress - Egress ``` ### 生产环境建议 1. **VIP实现**:使用Keepalived或kube-vip实现VIP 2. **持久化存储**:配置Ceph RBD或NFS存储 3. **日志收集**:部署EFK(Elasticsearch+Fluentd+Kibana)栈 4. **监控告警**:部署Prometheus+Grafana+Alertmanager 5. **备份恢复**:使用Velero定期备份集群状态 > **注意**: > 1. 所有二进制文件需与麒麟V10 SP2兼容,建议在相同环境编译 > 2. 离线镜像需定期更新安全补丁(CVE扫描) > 3. 高可用测试应包括节点故障模拟和网络分区测试 > 4. 使用`kubectl drain`和`kubectl uncordon`进行安全维护[^1] --- ### 安装脚本结构 ``` offline-k8s-installer/ ├── bin/ # Kubernetes二进制文件 ├── images/ # 容器镜像 ├── rpms/ # 依赖RPM包 ├── configs/ # 配置文件模板 ├── ha/ # 高可用组件 ├── install.sh # 主安装脚本 └── validate.sh # 集群验证脚本 ``` [^1]: 基于银河麒麟V10 SP2的Kubernetes高可用部署实践
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值