Kubernetes 安装

kubernetes 安装和简单初始化配置

kubernetes

 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"
  • cni 插件安装
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
  • 安装 k8s 工具:
 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 安装文档

  1. 安装 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.

  1. 安装自定义资源 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. 确认是否安装成功
1
watch kubectl get pods -n calico-system
  1. 删除控制平面上的污点,以便您可以在其上调度 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
  • 创建长期 token
 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
  • 创建 token 后,获取 token
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.2ingress 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
  • 查看 ingress 代理
1
2
kubectl get svc -n ingress-nginx
> ingress-nginx-controller NodePort 10.99.122.88 <none> 80:30915/TCP,443:30157/TCP
  1. 执行 k8s 环境和系统内核参数初始化脚本:k8s 环境初始化脚本
  2. 执行 k8s master 初始化脚本:k8s master 初始化脚本
  3. 执行 k8s calico 网络初始化脚本:k8s calico 网络初始化脚本
  4. 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

相关内容