|  1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
 | # 配置内核模块
cat <<EOF | tee /etc/modules-load.d/optimize.conf
overlay
br_netfilter
EOF
modprobe overlay
modprobe br_netfilter
# 支持 IPVS needs module - package ipset
cat <<EOF | tee /etc/modules-load.d/ipvs.conf
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
# package ipset,网络工具
yum install -y ipset ipvsadm
# sysctl params required by setup, params persist across reboots
cat <<EOF | sudo tee /etc/sysctl.d/optimize.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF
# Apply sysctl params without reboot
# sudo sysctl --system
sysctl -p /etc/sysctl.d/optimize.conf
# 设置系统打开文件最大数
cat >> /etc/security/limits.conf <<EOF
    * soft nofile 65535
    * hard nofile 65535
EOF
 | 
 
| 1
2
 | sed -i '/ swap /s/^\(.*\)$/#\1/' /etc/fstab
swapoff -a
 | 
 
| 1
2
3
4
5
6
 | # 添加指定路由
ip route add 10.10.10.0/24 via 10.10.10.4 dev ens32
# 添加默认路由
ip route add default via 10.10.10.4 dev ens32
# 删除路由
ip route del default via 10.10.10.2 dev ens32 
 | 
 
| 1
2
3
4
5
 | yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install -y containerd.io
# 配置开启自启
systemctl enable containerd
 | 
 
| 1
2
3
 | # 生成默认 containerd 配置
mv /etc/containerd/config.toml /etc/containerd/config.toml.origin
containerd config default > /etc/containerd/config.toml
 | 
 
基于 systemd 类型的 linux 使用 systemd 驱动。配置 /etc/containerd/config.toml
| 1
2
 | # 命令直接修改, SystemdCgroup : false -> true
sed -i '/SystemdCgroup/s/false/true/' /etc/containerd/config.toml
 | 
 
| 1
2
3
4
5
6
7
8
9
 |       [plugins."io.containerd.grpc.v1.cri".containerd.runtimes]
        [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
          ...
          
          [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
            ...
            # false 修改为 true
            SystemdCgroup = true
 | 
 
修改 sandbox_image pause 镜像:
| 1
2
3
4
5
6
 |  [plugins."io.containerd.grpc.v1.cri"]
    ...
    # sandbox_image = "registry.k8s.io/pause:3.6"
    # 注意:这里的 pause 版本需要 kubeadm config image list 中版本一致 (后面修改)
    # 否则后面 kubeadm init 会过不去,卡住
	sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"
 | 
 
还可以配置一下 containerd 镜像加速,有需要的自助搜索如何配置。
重新加载配置,开机自启,启动 containerd:
| 1
 | systemctl daemon-reload && systemctl restart containerd
 | 
 
CNI (Container Network Interface) - 容器网络接口。CNI 插件版本列表,cni 1.3.0 x86 下载
默认 cni 网络接口插件 bin 路径:/etc/containerd/config.toml  cni 下配置定义。
| 1
2
3
4
 | [plugins]
    [plugins."io.containerd.grpc.v1.cri".cni]
      bin_dir = "/opt/cni/bin"
      conf_dir = "/etc/cni/net.d"
 | 
 
| 1
2
3
 | # cni 网络配置
mkdir -p /opt/cni/bin/
tar -zxf cni-plugins-linux-amd64-v1.3.0.tgz -C /opt/cni/bin/
 | 
 
k8s 安装文档,ali 镜像源配置文档
| 1
2
3
4
5
6
7
8
9
 | cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
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
EOF
 | 
 
|  1
 2
 3
 4
 5
 6
 7
 8
 9
10
 | # 安装
yum makecache -y
yum install -y kubelet kubeadm kubectl
# 安装指定版本
yum list --showduplicate kubelet | sort
yum install -y kubelet-1.28.2-0 kubeadm-1.28.2-0 kubectl-1.28.2-0
# 开机自启,不用启动,后面 kubeadm init 会自动启动 kubelet
systemctl enable kubelet
 | 
 
保证 docker 使用的 cgroupdriver 和 kubelet 使用的 cgroup 保持一致
| 1
2
3
4
5
 | # /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
# 命令行插入配置
echo 'KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"' > /etc/sysconfig/kubelet
 | 
 
参考 “使用配置文件 kubeadm init”
查看默认初始化配置 : kubeadm config print init-defaults
列出初始化镜像: kubeadm config images list --kubernetes-version ${k8s_version}
拉取指定版本 k8s 镜像: kubeadm config images pull --kubernetes-version ${k8s_version}
按照指定配置文件拉取 k8s 镜像: kubeadm config images pull --config=kubeadm-init.yaml
指定 k8s 初始化: kubeadm init --config=kubeadm-init.yaml --upload-certs | tee kubeadm-init.log
由于 k8s 默认镜像仓库为 registry.k8s.io ,国内无法拉取,有资源的朋友可以直接拉取,不用更改镜像源。
下面操作都使用阿里开放的 kubernetes 镜像源仓库。
**注意:**这里 pause 版本需要同步到 containerd 配置文件中 sandbox_image: pause 版本 。
| 1
2
3
4
5
6
 | # 查看指定版本镜像
kubeadm config images list --kubernetes-version=1.28.2 --image-repository=registry.aliyuncs.com/google_containers
# 拉取镜像
kubeadm config images pull --kubernetes-version=1.28.2 --image-repository=registry.aliyuncs.com/google_containers
# 配置 containerd 后重启,修改 pause 镜像为 kubernetes 下载镜像
systemctl daemon-reload && systemctl restart containerd
 | 
 
|  1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
 | # 生成默认配置文件
kubeadm config print init-defaults > kubeadm-init.yaml
# 修改配置
# 1. 修改 k8s 主机地址
localAPIEndpoint:
  advertiseAddress: 10.10.10.109
# 2. 修改 k8s 名称,域名可访问
nodeRegistration:
  name: k8s-master
# 3. 替换为国内的镜像仓库
imageRepository: registry.aliyuncs.com/google_containers
# 4. 配置确定的 k8s 版本
kubernetesVersion: 1.28.2
# 5. 修改 pod 网络段
networking:
  podSubnet: 10.244.0.0/16
# 6. 新增配置项
---
# 申明 cgroup 用 systemd
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
# cgroupfs
cgroupDriver: systemd
failSwapOn: false
---
# 启用 ipvs
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
 | 
 
初始化报错可以执行重置命令:kubeadm reset -f
| 1
 | kubeadm init --config=kubeadm-init.yaml --upload-certs | tee kubeadm-init.log
 | 
 
按照初始化完成后的提示执行命令。恭喜兄弟们, k8s 就这样安装完成,从节点仅需执行 jion 命令就可加入。
|  1
 2
 3
 4
 5
 6
 7
 8
 9
10
 | # 查看 k8s 版本镜像列表
kubeadm config images list --kubernetes-version=1.28.2 --image-repository=registry.aliyuncs.com/google_containers
# 先用国内镜像站下载镜像
kubeadm config images pull --kubernetes-version=1.28.2 --image-repository=registry.aliyuncs.com/google_containers | tee k8s-images.log
# 更改 containerd pause 镜像源,配置文件 /etc/containerd/config.toml
sandbox_image = "registry.k8s.io/pause:3.9"
# 变为国内镜像站
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"
 | 
 
镜像转换脚本:(tag 为 registry.k8s.io 的镜像)
|  1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
 | #!/bin/bash
CN_REPOSITORY=registry.aliyuncs.com/google_containers
K8S_REPOSITORY=registry.k8s.io
K8S_VERSION=1.28.2
IMG_FILE=k8s-images.log
# 用国内 k8s 镜像仓库下载
kubeadm config images pull --image-repository=${CN_REPOSITORY} --kubernetes-version=${K8S_VERSION} | tee ${IMG_FILE}
# 国内 tag 转为 k8s 官方 tag
# 1. 排除 coredns ,因为 coredns 特殊,镜像有层级
kubeadm config images list --kubernetes-version=${K8S_VERSION} | awk -F'/' '{print $NF}' | grep -v coredns  | xargs -n1 -I{} nerdctl tag --namespace k8s.io ${CN_REPOSITORY}/{} ${K8S_REPOSITORY}/{}
# 2. coredns 单独处理
kubeadm config images list --kubernetes-version=${K8S_VERSION} | awk -F'/' '{print $NF}' | grep coredns | xargs -n1 -I{} nerdctl tag --namespace k8s.io ${CN_REPOSITORY}/{} ${K8S_REPOSITORY}/coredns/{}
 | 
 
|  1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
 | # 提取拉取镜像,指定镜像仓库
kubeadm config images pull --kubernetes-version=1.28.2 --image-repository=registry.aliyuncs.com/google_containers
# 采用命令行初始化
kubeadm init --apiserver-advertise-address=10.10.10.109 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --kubernetes-version=1.28.2 --upload-certs
# 采用初始化配置文件初始化
# podSubnet: 10.244.0.0/16
kubeadm config print init-defaults > kubeadm-init.yaml
kubeadm init --config=kubeadm-init.yaml --upload-certs | tee kubeadm-init.log
# 出问题后重置环境
kubeadm reset -f
 | 
 
Calico 安装文档
- 安装 Calico operator calico-tigera-operator-v3.26.1.yaml 下载
| 1
2
3
4
5
6
7
 | kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/tigera-operator.yaml
# 或者离线安装
wget https://www.nihility.cn/files/container/calico-tigera-operator-v3.26.1.yaml
kubectl create -f calico-tigera-operator-v3.26.1.yaml
# 或在线安装
kubectl create -f https://www.nihility.cn/files/container/calico-tigera-operator-v3.26.1.yaml
 | 
 
Due to the large size of the CRD bundle, kubectl apply might exceed request limits. Instead, use kubectl create or kubectl replace.
- 安装自定义资源 calico-custom-resources-v3.26.1.yaml 下载
| 1
2
3
4
5
 | kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/custom-resources.yaml
# 推荐离线安装,因为需要修改 pod 网段
wget https://www.nihility.cn/files/container/calico-custom-resources-v3.26.1.yaml
kubectl create -f calico-custom-resources-v3.26.1.yaml
 | 
 
修改配置中 cidr: 192.168.0.0/16 为用户定义 (常用: 10.244.0.0/16)
- 确认是否安装成功
| 1
 | watch kubectl get pods -n calico-system
 | 
 
- 删除控制平面上的污点,以便您可以在其上调度 Pod
| 1
2
 | kubectl taint nodes --all node-role.kubernetes.io/control-plane-
kubectl taint nodes --all node-role.kubernetes.io/master-
 | 
 
dashboard 下载链接
dashboard v2.7.0 版本安装, dashboard v2.7.0 安装脚本链接
| 1
2
3
4
5
 | # dashboard github 安装地址
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
# 个人分析脚本地址
kubectl apply -f https://www.nihility.cn/files/container/dashboard-recommended-deploy-v2.7.0.yaml
 | 
 
查看安装情况:
| 1
2
3
4
 | # 简略信息
kubectl get pods -n kubernetes-dashboard
# 详细信息
kubectl get pods -n kubernetes-dashboard -o wide
 | 
 
简单 Bearer 登录:
| 1
2
3
4
5
6
 | # 获取 kubernetes dashboard service 地址
kubectl get svc -n kubernetes-dashboard -o wide
# 配置 service 为 NodePort
# 把 type :ClusterIP 改为 type: NodePort 
kubectl edit svc kubernetes-dashboard  -n kubernetes-dashboard
 | 
 
获取 svc 访问地址:
| 1
2
3
4
5
 | kubectl get svc -n kubernetes-dashboard
---
NAME                        TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)         AGE
dashboard-metrics-scraper   ClusterIP   10.105.33.159   <none>        8000/TCP        28m
kubernetes-dashboard        NodePort    10.103.26.86    <none>        443:31326/TCP   28m
 | 
 
使用 token 登录:
默认情况下,Dashboard 会使用最少的 RBAC 配置进行部署。 当前,Dashboard 仅支持使用 Bearer 令牌登录。
注意: 请确保您知道自己在做什么。向仪表板的服务帐户授予管理员权限可能会存在安全风险。
创建 dashboard 登录账户:
- 创建一个 Service Account,在 kubernetes-dashboard 命名空间下创建名为 admin-user 的账号。
|  1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
 | # dashboard-adminuser.yaml
cat <<EOF > dashboard-adminuser.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard
EOF
# 应用此配置
kubectl apply -f dashboard-adminuser.yaml
 | 
 
|  1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
 | # cluster-role-authorization.yml
cat <<EOF > cluster-role-authorization.yml
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
EOF
kubectl apply -f cluster-role-authorization.yml
 | 
 
- 创建 Service-Account Bearer Token 命令执行后会输出 token 。就可以去登录 dashboard 了。
| 1
 | kubectl -n kubernetes-dashboard create token admin-user
 | 
 
|  1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
 | # dashboard-long-live-bearer-token.yaml
cat <<EOF > dashboard-long-live-bearer-token.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 
EOF
kubectl apply -f dashboard-long-live-bearer-token.yaml
 | 
 
| 1
 | kubectl get secret admin-user -n kubernetes-dashboard -o jsonpath={".data.token"} | base64 -d
 | 
 
| 1
2
 | kubectl -n kubernetes-dashboard delete serviceaccount admin-user
kubectl -n kubernetes-dashboard delete clusterrolebinding admin-user
 | 
 
ingress-nginx 部署链接,ingress github 链接
ingress controller v1.8.2,ingress v1.8.2 部署 yaml
注意:镜像源 registry.k8s.io 改为国内镜像源  registry.aliyuncs.com/google_containers
| 1
2
3
4
5
6
7
8
9
 | # github 官方,国内此地址有可能无法访问,且默认 k8s 镜像源无法访问
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.2/deploy/static/provider/baremetal/deploy.yaml
# 镜像调整,改为
image: registry.aliyuncs.com/google_containers/nginx-ingress-controller:v1.8.2
image: registry.aliyuncs.com/google_containers/kube-webhook-certgen:v20230407
# 个人地址
kubectl apply -f https://www.nihility.cn/files/container/ingress-controller-baremetal-deploy-v1.8.2.yaml
 | 
 
| 1
 | kubectl get pods -n ingress-nginx
 | 
 
| 1
2
 | kubectl get svc -n ingress-nginx
> ingress-nginx-controller NodePort 10.99.122.88 <none> 80:30915/TCP,443:30157/TCP
 | 
 
- 执行 k8s 环境和系统内核参数初始化脚本:k8s 环境初始化脚本
- 执行 k8s master 初始化脚本:k8s  master 初始化脚本
- 执行 k8s calico 网络初始化脚本:k8s  calico 网络初始化脚本
- k8s 从节点安装脚本:k8s 从节点安装脚本
error execution phase preflight: couldn’t validate the identity of the API Server: could not find a JWS signature in the cluster-info ConfigMap for token ID “abcdef”
解决办法:重新在 master 节点生成新的 join token
| 1
 | kubeadm token create --print-join-command
 |