文章目录
节点架构
# 负载均衡,负载三个主节点 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
初始化高可用节点
你可以使用 --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