官方文档k8s1.30安装部署高可用集群,kubeadm安装Kubernetes1.30最新版本

发布于:2024-05-09 ⋅ 阅读:(24) ⋅ 点赞:(0)

节点架构

# 负载均衡,负载三个主节点
172.25.14.100 lbserver

# 控制节点
172.25.14.101 master1
172.25.14.102 master2
172.25.14.103 master3

# 服务运行节点
172.25.14.111 node1
172.25.14.112 node2
172.25.14.113 node3
172.25.14.114 node4
172.25.14.115 node5

一、准备开始(每一台机器都执行)

  • 一台兼容的 Linux 主机。Kubernetes 项目为基于 Debian 和 Red Hat 的 Linux 发行版以及一些不提供包管理器的发行版提供通用的指令。
  • 每台机器 2 GB 或更多的 RAM(如果少于这个数字将会影响你应用的运行内存)。
  • CPU 2 核心及以上。
  • 集群中的所有机器的网络彼此均能相互连接(公网和内网都可以)。
  • 节点之中不可以有重复的主机名、MAC 地址或 product_uuid。
    # 确保每个节点上 MAC 地址和 product_uuid 的唯一性
    ip link # 获取网络接口的 MAC 地址
    sudo cat /sys/class/dmi/id/product_uuid # 校验 product_uuid 唯一性
    
  • 交换分区的配置。kubelet 的默认行为是在节点上检测到交换内存时无法启动。 kubelet 自 v1.22 起已开始支持交换分区。自 v1.28 起,仅针对 cgroup v2 支持交换分区; kubelet 的 NodeSwap 特性门控处于 Beta 阶段,但默认被禁用。
    # 关闭交换分区
    sudo swapoff -a
    
    # 永久关闭交换分区
    vim /etc/fstab
    
    在这里插入图片描述

1️⃣ 检查所需端口(可以直接关闭防火墙放开所有端口)

端口和协议

当你在一个有严格网络边界的环境里运行 Kubernetes,例如拥有物理网络防火墙或者拥有公有云中虚拟网络的自有数据中心, 了解 Kubernetes 组件使用了哪些端口和协议是非常有用的。

控制面
协议 方向 端口范围 目的 使用者
TCP 入站 6443 Kubernetes API server 所有
TCP 入站 2379-2380 etcd server client API kube-apiserver, etcd
TCP 入站 10250 Kubelet API 自身, 控制面
TCP 入站 10259 kube-scheduler 自身
TCP 入站 10257 kube-controller-manager 自身

尽管 etcd 的端口也列举在控制面的部分,但你也可以在外部自己托管 etcd 集群或者自定义端口。

工作节点
协议 方向 端口范围 目的 使用者
TCP 入站 10250 Kubelet API 自身, 控制面
TCP 入站 30000-32767 NodePort Services† 所有

所有默认端口都可以重新配置。当使用自定义的端口时,你需要打开这些端口来代替这里提到的默认端口。

一个常见的例子是 API 服务器的端口有时会配置为 443。或者你也可以使用默认端口, 把 API 服务器放到一个监听 443 端口的负载均衡器后面,并且路由所有请求到 API 服务器的默认端口。

关闭防火墙

# 关闭防火墙
systemctl stop firewalld && systemctl disable firewalld

关闭 SELinux

# 将 SELinux 设置为 permissive 模式(相当于将其禁用)
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

2️⃣ 安装containerd容器

启用 IPv4 数据包转发

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

# 设置所需的 sysctl 参数,参数在重新启动后保持不变
cat <<EOF | sudo 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 参数而不重新启动
sudo sysctl --system

使用以下命令验证 net.ipv4.ip_forward 是否设置为 1:

sudo sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables net.ipv4.ip_forward

containerd部署

github下载
蓝奏云下载:https://grafies.lanzoum.com/iDTv81xw593e
蓝奏云所有文件下载地址:https://grafies.lanzoum.com/b0hbz5joh 密码:dvl2

# 上传到服务并解压缩到/usr/local 下
tar Cxzvf /usr/local containerd-1.7.16-linux-amd64.tar.gz

# 下载服务启动文件
wget -O /etc/systemd/system/containerd.service https://raw.githubusercontent.com/containerd/containerd/main/containerd.service
systemctl daemon-reload
systemctl enable --now containerd

# 安装runc
wget https://github.com/opencontainers/runc/releases/download/v1.1.12/runc.amd64
sudo install -m 755 runc.amd64 /usr/local/sbin/runc

# 安装CNI插件
wget https://github.com/containernetworking/plugins/releases/download/v1.4.1/cni-plugins-linux-amd64-v1.4.1.tgz
sudo mkdir -p /opt/cni/bin
sudo tar Cxzvf /opt/cni/bin/ cni-plugins-linux-amd64-v1.4.1.tgz
containerd切换为国内源

如果kubeadm init有问题,可以删除/etc/containerd/config.toml文件

# 创建containerd目录
mkdir /etc/containerd

#mv /etc/containerd/config.toml /etc/containerd/config.toml.bak

# 恢复默认配置文件
containerd config default > /etc/containerd/config.toml

# 切换为国内源
sed -i 's/registry.k8s.io/registry.aliyuncs.com\/google_containers/' /etc/containerd/config.toml

# 重启服务
systemctl daemon-reload
systemctl restart containerd

3️⃣ 设置/etc/hosts

cat <<EOF | sudo tee /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
172.25.14.101 master1
172.25.14.102 master2
172.25.14.103 master3

172.25.14.111 node1
172.25.14.112 node2
172.25.14.113 node3
172.25.14.114 node4
172.25.14.115 node5
EOF

二、安装 kubeadm、kubelet 和 kubectl(每一台机器都执行)

你需要在每台机器上安装以下的软件包:

  • kubeadm:用来初始化集群的指令。
  • kubelet:在集群中的每个节点上用来启动 Pod 和容器等。
  • kubectl:用来与集群通信的命令行工具。

添加 yum仓库,修改 v1.30版本可以安装其他版本

# 此操作会覆盖 /etc/yum.repos.d/kubernetes.repo 中现存的所有配置
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.30/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.30/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
EOF

安装 kubelet、kubeadm 和 kubectl,并启用 kubelet 以确保它在启动时自动启动

sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
sudo systemctl enable --now kubelet

kubelet 现在每隔几秒就会重启,因为它陷入了一个等待 kubeadm 指令的死循环。


三、使用 kubeadm 创建集群

拉取需要的镜像

kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers

初始化控制平面节点

# 创建初始化配置文件
kubeadm config print init-defaults > /etc/kubernetes/init-default.yaml

# 修改为国内阿里源
sed -i 's/registry.k8s.io/registry.aliyuncs.com\/google_containers/' /etc/kubernetes/init-default.yaml

# 设置 apiServerIP 地址. 请自行替换172.25.14.101为自己宿主机IP
sed -i 's/1.2.3.4/172.25.14.101/' /etc/kubernetes/init-default.yaml

初始化单节点 kubeadm init --image-repository registry.aliyuncs.com/google_containers


初始化高可用节点

利用 kubeadm 创建高可用集群

你可以使用 --kubernetes-version 标志来设置要使用的 Kubernetes 版本。 建议将 kubeadm、kebelet、kubectl 和 Kubernetes 的版本匹配。

这个 --control-plane-endpoint 标志应该被设置成负载均衡器的地址或 DNS 和端口。

这个 --upload-certs 标志用来将在所有控制平面实例之间的共享证书上传到集群。 如果正好相反,你更喜欢手动地通过控制平面节点或者使用自动化工具复制证书, 请删除此标志并参考如下部分证书分配手册

kubeadm init --image-repository registry.aliyuncs.com/google_containers --control-plane-endpoint "LOAD_BALANCER_DNS:LOAD_BALANCER_PORT" --upload-certs

其中"LOAD_BALANCER_DNS:LOAD_BALANCER_PORT"为api-server负责均衡的IP和端口
如果api-server 负责均衡地址为172.25.14.100:6443

# 代理了下面 api-server 服务地址
172.25.14.101:6443
172.25.14.102:6443
172.25.14.103:6443

完整的高可用初始化命令为

kubeadm init --image-repository registry.aliyuncs.com/google_containers --control-plane-endpoint "172.25.14.100:6443" --upload-certs

初始化完成后出现以下界面
在这里插入图片描述

开始使用集群前,您需要以普通用户身份运行以下命令:

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

或者,如果您是 root 用户,可以直接设置环境变量:

export KUBECONFIG=/etc/kubernetes/admin.conf

接下来,您应该向集群部署一个 Pod 网络。

# 如果你没有令牌,可以通过在控制平面节点上运行以下命令来获取令牌:
kubeadm token list
# 默认情况下,令牌会在 24 小时后过期。如果要在当前令牌过期后将节点加入集群, 则可以通过在控制平面节点上运行以下命令来创建新令牌
kubeadm token create
# 查看集群状态,此时 coredns 服务为Pending状态,我们需要安装网络插件
kubectl get pods --all-namespaces

安装网络插件

蓝奏云所有文件下载地址:https://grafies.lanzoum.com/b0hbz5joh 密码:dvl2

# 进入kubernetes配置文件目录
cd /etc/kubernetes/

# 下载 yaml 文件到kubernetes配置文件目录
wget https://docs.projectcalico.org/manifests/calico.yaml

# 如果上面初始化主节点时修改过POD的IP,去掉注释,替换为修改的pod的IP
kubectl apply -f /etc/kubernetes/calico.yaml

需要修改的地方为,如果上面初始化主节点时修改过POD的IP,去掉注释,替换为修改的pod的IP,我这里没有修改过,所以不用替换
在这里插入图片描述



加入主节点和 node 节点

在 master1 初始化时,有生成的加入 master 节点和 node 节点的命令

You can now join any number of the control-plane node running the following command on each as root:

  kubeadm join master1:6443 --token iain2r.id7zulwl6weslham \
        --discovery-token-ca-cert-hash sha256:3e0a5577e578215df4e7c243e9f843a00382bb6913f0c31b6eec0c3b67369c49 \
        --control-plane --certificate-key c89f1873fe75b408e2eceaad6eeead9400109fbd736112bc50a5d0485ca5272d

Please note that the certificate-key gives access to cluster sensitive data, keep it secret!
As a safeguard, uploaded-certs will be deleted in two hours; If necessary, you can use
"kubeadm init phase upload-certs --upload-certs" to reload certs afterward.

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join master1:6443 --token iain2r.id7zulwl6weslham \
        --discovery-token-ca-cert-hash sha256:3e0a5577e578215df4e7c243e9f843a00382bb6913f0c31b6eec0c3b67369c49 

重新生成加入节点命令

如果已经遗忘,可以使用下面命令重新生成加入节点命令

生成 token,node 节点加入直接执行就可以了

# 生成加入节点的 token
[root@master1 ~]# kubeadm token create --print-join-command
kubeadm join 172.25.14.101:6443 --token iobz8n.rqo9u0yuok99otlj --discovery-token-ca-cert-hash sha256:64d2335ede8c3f8866095888db0b809ba44e2f2208d0861d70cb15ff4586a5b1 
加入 node 节点

在要加入的node 节点执行

[root@node1 tar]# kubeadm join master1:6443 --token fng8dv.8b7bcnosokbx2jjo --discovery-token-ca-cert-hash sha256:3e0a5577e578215df4e7c243e9f843a00382bb6913f0c31b6eec0c3b67369c49
[root@node1 tar]# mkdir ~/.kube
[root@node1 tar]# cp /etc/kubernetes/kubelet.conf  ~/.kube/config
加入 master 节点

如果需要添加master节点,使用 kubeadm init phase upload-certs --upload-certs 重新生成certificate-key(这里需要注意老版本 需要用 kubeadm init phase upload-certs --experimental-upload-certs 生成)

[root@master1 ~]# kubeadm init phase upload-certs --upload-certs
[upload-certs] Storing the certificates in Secret "kubeadm-certs" in the "kube-system" Namespace
[upload-certs] Using certificate key:
c16782bf98ebdaf1ee1592c6d332826f67d579f2fac981c5e72486772adce9ac

然后加 master 节点:用上面生成的 work join 命令和后面生成的生成的--certificate-key 值拼接起来执行

[root@master3 ~]# kubeadm join 172.25.14.101:6443 --token iobz8n.rqo9u0yuok99otlj --discovery-token-ca-cert-hash sha256:64d2335ede8c3f8866095888db0b809ba44e2f2208d0861d70cb15ff4586a5b1 --control-plane  --certificate-key c16782bf98ebdaf1ee1592c6d332826f67d579f2fac981c5e72486772adce9ac 

master3 加入节点

# master3 执行上面命令加入节点
[root@master3 ~]# kubeadm join 172.25.14.101:6443 --token iobz8n.rqo9u0yuok99otlj --discovery-token-ca-cert-hash sha256:64d2335ede8c3f8866095888db0b809ba44e2f2208d0861d70cb15ff4586a5b1

在这里插入图片描述

完成后显示上面图片状态,所有主节点加入后必须要执行下面命令

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

四、安装图形化界面

helm安装
GitHub 下载地址
蓝奏云所有文件下载地址:https://grafies.lanzoum.com/b0hbz5joh 密码:dvl2

# 下载 helm
wget https://get.helm.sh/helm-v3.14.4-linux-amd64.tar.gz
tar xvf helm-v3.14.4-linux-amd64.tar.gz

mv linux-amd64/helm /usr/local/bin/helm && rm -rf linux-amd64

当您已经安装好了Helm之后,您可以添加一个chart 仓库。从 Artifact Hub中查找有效的Helm chart仓库。

$ helm repo add bitnami https://charts.bitnami.com/bitnami

当添加完成,您将可以看到可以被您安装的charts列表:

$ helm search repo bitnami
NAME                             	CHART VERSION	APP VERSION  	DESCRIPTION
bitnami/bitnami-common           	0.0.9        	0.0.9        	DEPRECATED Chart with custom templates used in ...
bitnami/airflow                  	8.0.2        	2.0.0        	Apache Airflow is a platform to programmaticall...
bitnami/apache                   	8.2.3        	2.4.46       	Chart for Apache HTTP Server
bitnami/aspnet-core              	1.2.3        	3.1.9        	ASP.NET Core is an open-source framework create...
# ... and many more

部署 Dashboard UI

# 添加 kubernetes-dashboard 仓库
helm repo add kubernetes-dashboard https://kubernetes.github.io/dashboard
# 使用 kubernetes-dashboard Chart 部署名为 `kubernetes-dashboard` 的 Helm Release
helm upgrade --install kubernetes-dashboard kubernetes-dashboard/kubernetes-dashboard --create-namespace --namespace kubernetes-dashboard

修改service的type类型为NodePort,使其可以外部访问

kubectl edit svc kubernetes-dashboard-kong-proxy -n kubernetes-dashboard

在这里插入图片描述

# 找到端口,在安全组放行
[root@master1 kubernetes]# kubectl get svc -A |grep kubernetes-dashboard
kubernetes-dashboard   kubernetes-dashboard-api               ClusterIP   10.103.55.225    <none>        8000/TCP                        3m50s
kubernetes-dashboard   kubernetes-dashboard-auth              ClusterIP   10.103.219.197   <none>        8000/TCP                        3m50s
kubernetes-dashboard   kubernetes-dashboard-kong-manager      NodePort    10.98.238.74     <none>        8002:32313/TCP,8445:31643/TCP   3m50s
kubernetes-dashboard   kubernetes-dashboard-kong-proxy        NodePort    10.109.52.96     <none>        443:31374/TCP                   3m50s
kubernetes-dashboard   kubernetes-dashboard-metrics-scraper   ClusterIP   10.99.201.33     <none>        8000/TCP                        3m50s
kubernetes-dashboard   kubernetes-dashboard-web               ClusterIP   10.104.253.8     <none>        8000/TCP                        3m50s

访问: https://集群任意IP:端口 https://172.25.14.101:31374

创建访问账号,准备一个yaml文件; vim /etc/kubernetes/dashadm.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 /etc/kubernetes/dashadm.yaml

获取访问令牌

kubectl -n kubernetes-dashboard create token admin-user

输入到仪表盘中
在这里插入图片描述







参考资料:
安装 kubeadm
利用 kubeadm 创建高可用集群
Kubeadm init 错误 - API 服务器未运行
安装 containerd
etcd cluster is not healthy 将一个master控制节点踢出后重新加入集群发现报错










Tpis:

container镜像解决方案

在这里插入图片描述
/etc/containerd/config.toml这个文件里面,找到sandbox_image = "registry.k8s.io/pause:3.6"
改为sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"
在这里插入图片描述
然后重启服务


master控制节点踢出后重新加入集群发现etcd报错

【k8s】 etcd cluster is not healthy 将一个master控制节点踢出后重新加入集群发现报错
kubernets将一个master控制节点踢出后重新加入集群发现报错

error execution phase check-etcd: etcd cluster is not healthy: failed to dial endpoint https://172.25.14.103:2379 with maintenance client: context deadline exceeded
To see the stack trace of this error execute with --v=5 or higher

报错结果显示etcd集群运行不正常,其实在kubeadm join加入集群时打开 -v=5 选项,提高日志等级就可以发现,提示刚刚踢出的master节点etcd无法连接。原因是将master节点踢出后,etcd集群并未将其踢出etcd集群,需要我们手动进行移除。
下载etcdctl命令行工具

export RELEASE=$(curl -s https://api.github.com/repos/etcd-io/etcd/releases/latest|grep tag_name | cut -d '"' -f 4)
wget https://github.com/etcd-io/etcd/releases/download/${RELEASE}/etcd-${RELEASE}-linux-amd64.tar.gz
tar xvf etcd-${RELEASE}-linux-amd64.tar.gz
cd etcd-${RELEASE}-linux-amd64
sudo mv etcd etcdctl etcdutl /usr/local/bin

登陆一台现有的master机器并查看现有的etcd集群列表

[root@master1 tar]# etcdctl --endpoints 127.0.0.1:2379 --cacert /etc/kubernetes/pki/etcd/ca.crt --cert /etc/kubernetes/pki/etcd/server.crt --key /etc/kubernetes/pki/etcd/server.key member list
7083115c92eb133, started, master1, https://172.25.14.101:2380, https://172.25.14.101:2379, false
46dbbda45a5f29a1, started, master2, https://172.25.14.102:2380, https://172.25.14.102:2379, false
b8a567692e712730, started, master3, https://172.25.14.103:2380, https://172.25.14.103:2379, false

现在将这台服务器的etcd从集群中移除

etcdctl --endpoints 127.0.0.1:2379 --cacert /etc/kubernetes/pki/etcd/ca.crt --cert /etc/kubernetes/pki/etcd/server.crt --key /etc/kubernetes/pki/etcd/server.key member remove b8a567692e712730

移除之后,新节点就可以正常加入集群了

helm安装

tar xvf helm-v3.14.4-linux-amd64.tar.gz

mv linux-amd64/helm /usr/local/bin/helm && rm -rf linux-amd64

当您已经安装好了Helm之后,您可以添加一个chart 仓库。从 Artifact Hub中查找有效的Helm chart仓库。

$ helm repo add bitnami https://charts.bitnami.com/bitnami

当添加完成,您将可以看到可以被您安装的charts列表:

$ helm search repo bitnami
NAME                             	CHART VERSION	APP VERSION  	DESCRIPTION
bitnami/bitnami-common           	0.0.9        	0.0.9        	DEPRECATED Chart with custom templates used in ...
bitnami/airflow                  	8.0.2        	2.0.0        	Apache Airflow is a platform to programmaticall...
bitnami/apache                   	8.2.3        	2.4.46       	Chart for Apache HTTP Server
bitnami/aspnet-core              	1.2.3        	3.1.9        	ASP.NET Core is an open-source framework create...
# ... and many more