- kubeadm介绍
- kubeadm概述
- kubeadm功能
- 本方案描述
- 部署规划
- 节点规划
- 主机名配置
- 变量准备
- 互信配置
- 环境初始化
- 部署高可用组件
- HAProxy安装
- KeepAlived安装
- 创建配置文件
- 启动服务
- 集群部署
- 相关组件包
- 正式安装
- 集群初始化
- 拉取镜像
- Master01上初始化
- 添加Master节点
- 安装NIC插件
- NIC插件介绍
- 部署calico
- 修改node端口范围
- 开启非安全端口
- 添加Worker节点
- 添加Worker节点
- 确认验证
- Metrics部署
- Metrics介绍
- 开启聚合层
- 获取部署文件
- 正式部署
- 查看资源监控
- Nginx ingress部署
- 设置标签
- 获取资源
- 修改配置
- 确认验证
- Dashboard部署
- 设置标签
- 创建证书
- 手动创建secret
- 下载yaml
- 修改yaml
- 正式部署
- 创建管理员账户
- ingress暴露dashboard
- 创建ingress tls
- 创建ingress策略
- 访问dashboard
- 创建kubeconfig文件
- 导入证书
- 测试访问dashboard
- Longhorn存储部署
- Longhorn概述
- 基础软件安装
- 设置标签
- 准备磁盘
- 配置Longhorn
- 动态sc创建
- 测试PV及PVC
- Ingress暴露Longhorn
- 确认验证
- Helm部署
- 前置准备
- 二进制安装Helm
- Helm操作
- 查找chart
- 添加repo
- 扩展:集群扩容及缩容
- 集群扩容
- 集群缩容
kubeadm介绍
kubeadm概述
Kubeadm 是一个工具,它提供了 kubeadm init 以及 kubeadm join 这两个命令作为快速创建 kubernetes 集群的最佳实践。
kubeadm 通过执行必要的操作来启动和运行一个最小可用的集群。kubeadm 只关心启动集群,而不关心其他工作,如部署前的节点准备工作、安装各种Kubernetes Dashboard、监控解决方案以及特定云提供商的插件,这些都不属于 kubeadm 关注范围。
kubeadm功能
kubeadm 主要有如下功能:
- kubeadm init 启动一个 Kubernetes 主节点;
- kubeadm join 启动一个 Kubernetes 工作节点并且将其加入到集群;
- kubeadm upgrade 更新一个 Kubernetes 集群到新版本;
- kubeadm config 如果使用 v1.7.x 或者更低版本的 kubeadm 初始化集群,您需要对集群做一些配置以便使用 kubeadm upgrade 命令;
- kubeadm token 管理 kubeadm join 使用的令牌;
- kubeadm reset 还原 kubeadm init 或者 kubeadm join 对主机所做的任何更改;
- kubeadm version 打印 kubeadm 版本;
- kubeadm alpha 预览一组可用的新功能以便从社区搜集反馈。
本方案描述
本方案基于kubeadm部署,且实现高可用,同时提供相关Kubernetes周边组件。本方案可直接应用于生产环境。
- 本方案采用kubeadm部署Kubernetes 1.21.0版本;
- 基础系统为CentOS8.3;
- etcd采用混部方式;
- KeepAlived:实现VIP高可用;
- HAProxy:以系统systemd形式运行,提供反向代理至3个master 6443端口;
- 其他主要部署组件包括:
- Metrics:度量;
- Dashboard:Kubernetes 图形UI界面;
- Helm:Kubernetes Helm包管理工具;
- Ingress:Kubernetes 服务暴露;
- containerd:Kubernetes底层容器时;
-
Longhorn:Kubernetes 动态存储组件。
-
worker04节点仅为测试模拟使用。
提示:本方案部署所使用脚本均由本人提供,可能不定期更新。
部署规划
节点规划
节点主机名 IP 类型 运行服务 master01 172.24.8.141 Kubernetes master节点 KeepAlived、HAProxy、containerd、etcd、kube-apiserver、kube-scheduler、kube-controller-manager、kubectl、kubelet、metrics、calico、rook-osd master02 172.24.8.142 Kubernetes master节点 KeepAlived、HAProxy、containerd、etcd、kube-apiserver、kube-scheduler、kube-controller-manager、kubectl、kubelet、metrics、calico、rook-osd master03 172.24.8.143 Kubernetes master节点 KeepAlived、HAProxy、containerd、etcd、kube-apiserver、kube-scheduler、kube-controller-manager、kubectl、kubelet、metrics、calico、rook-osd worker01 172.24.8.144 Kubernetes worker节点 containerd、kubelet、proxy、calico、rook-osd、ingress worker02 172.24.8.145 Kubernetes worker节点 containerd、kubelet、proxy、calico、rook-osd、ingress worker03 172.24.8.146 Kubernetes worker节点 containerd、kubelet、proxy、calico、rook-osd、ingress worker04 172.24.8.147 Kubernetes worker节点 containerd、kubelet、proxy、calico、rook-osd、ingress
Kubernetes的高可用主要指的是控制平面的高可用,即指多套Master节点组件和Etcd组件,工作节点通过负载均衡连接到各Master。
Kubernetes高可用架构中etcd与Master节点组件混布方式特点:
- 所需机器资源少
- 部署简单,利于管理
- 容易进行横向扩展
- etcd复用Kubernetes的高可用
- 风险大,一台master主机挂了,master和etcd就都少了一套,集群冗余度受到一定影响
提示:本实验使用Keepalived+HAProxy架构实现Kubernetes的高可用。
主机名配置
建议对所有节点主机名进行相应配置。
[root@master01 ~]# hostnamectl set-hostname master01 #其他节点依次修改
[root@master01 ~]# cat >> /etc/hosts << EOF
172.24.8.141 master01
172.24.8.142 master02
172.24.8.143 master03
172.24.8.144 worker01
172.24.8.145 worker02
172.24.8.146 worker03
EOF
变量准备
为实现自动化部署,便于管理和维护,建议做如下变量准备。
[root@master01 ~]# wget http://down.linuxsb.com/mydeploy/k8s/v1.21.0/environment.sh
[root@master01 ~]# vi environment.sh #确认相关主机名和IP
#!/bin/sh
#****************************************************************#
ScriptName: environment.sh
Author: xhy
Create Date: 2020-05-30 16:30
Modify Author: xhy
Modify Date: 2020-05-30 16:30
Version:
#***************************************************************#
集群 MASTER 机器 IP 数组
export MASTER_IPS=(172.24.8.141 172.24.8.142 172.24.8.143)
集群 MASTER IP 对应的主机名数组
export MASTER_NAMES=(master01 master02 master03)
集群 NODE 机器 IP 数组
export NODE_IPS=(172.24.8.144 172.24.8.145 172.24.8.146)
集群 NODE IP 对应的主机名数组
export NODE_NAMES=(worker01 worker02 worker03)
集群所有机器 IP 数组
export ALL_IPS=(172.24.8.141 172.24.8.142 172.24.8.143 172.24.8.144 172.24.8.145 172.24.8.146)
集群所有IP 对应的主机名数组
export ALL_NAMES=(master01 master02 master03 worker01 worker02 worker03)
互信配置
为了方便远程分发文件和执行命令,本实验配置master01节点到其它节点的 ssh 信任关系,即免秘钥管理所有其他节点。
[root@master01 ~]# ssh-keygen -f ~/.ssh/id_rsa -N ''
[root@master01 ~]# for all_ip in ${ALL_IPS[@]}
do
echo ">>> ${all_ip}"
ssh-copy-id -i ~/.ssh/id_rsa.pub root@${all_ip}
done
提示:此操作仅需要在master01节点操作。
环境初始化
kubeadm本身不负责对环境的准别,环境的初始化准备本方案使用脚本自动完成。
使用如下脚本对基础环境进行初始化,主要包括:
- 安装containerd
- 关闭SELinux及防火墙
- 优化相关内核参数
- 关闭swap
- 设置相关模块
- 配置相关基础软件
[root@master01 ~]# wget http://down.linuxsb.com/mydeploy/k8s/v1.21.0/k8sconinit.sh
[root@master01 ~]# vim k8sconinit.sh
#!/bin/sh
#****************************************************************#
ScriptName: k8sinit.sh
Author: xhy
Create Date: 2020-05-30 16:30
Modify Author: xhy
Modify Date: 2021-04-16 07:35
Version:
#***************************************************************#
Initialize the machine. This needs to be executed on every machine.
rm -f /var/lib/rpm/__db.00*
rpm -vv --rebuilddb
yum clean all
yum makecache
sleep 3s
Install containerd
CONVERSION=1.4.4 #确认containerd版本,其他保持默认
……
提示:此操作仅需要在master01节点操作。
- 对于某些特性,可能需要升级内核,内核升级操作见018.Linux升级内核。
- 4.19版及以上内核nf_conntrack_ipv4已经改为nf_conntrack。
- Kubernetes 1.20.0后可兼容的containerd版本最新为1.4.4。
[root@master01 ~]# source environment.sh
[root@master01 ~]# chmod +x *.sh
[root@master01 ~]# for all_ip in ${ALL_IPS[@]}
do
echo ">>> ${all_ip}"
scp -rp /etc/hosts root@${all_ip}:/etc/hosts
scp -rp k8sconinit.sh root@${all_ip}:/root/
ssh root@${all_ip} "bash /root/k8sconinit.sh"
done
部署高可用组件
HAProxy安装
HAProxy是可提供高可用性、负载均衡以及基于TCP(从而可以反向代理kubeapiserver等应用)和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种高可用解决方案。
[root@master01 ~]# for master_ip in ${MASTER_IPS[@]}
do
echo ">>> ${master_ip}"
ssh root@${master_ip} "yum -y install gcc gcc-c++ make libnl3 libnl3-devel libnfnetlink openssl-devel wget openssh-clients systemd-devel zlib-devel pcre-devel"
ssh root@${master_ip} "wget http://down.linuxsb.com/software/haproxy-2.3.9.tar.gz"
ssh root@${master_ip} "tar -zxvf haproxy-2.3.9.tar.gz"
ssh root@${master_ip} "cd haproxy-2.3.9/ && make ARCH=x86_64 TARGET=linux-glibc USE_PCRE=1 USE_ZLIB=1 USE_SYSTEMD=1 PREFIX=/usr/local/haprpxy && make install PREFIX=/usr/local/haproxy"
ssh root@${master_ip} "cp /usr/local/haproxy/sbin/haproxy /usr/sbin/"
ssh root@${master_ip} "useradd -r haproxy && usermod -G haproxy haproxy"
ssh root@${master_ip} "mkdir -p /etc/haproxy && cp -r /root/haproxy-2.3.9/examples/errorfiles/ /usr/local/haproxy/"
done
KeepAlived安装
KeepAlived 是一个基于VRRP协议来实现的LVS服务高可用方案,可以解决静态路由出现的单点故障问题。本方案3台master节点运行Keepalived,一台为主服务器(MASTER),另外两台为备份服务器(BACKUP)。
对集群外表现为一个虚拟IP,主服务器会发送特定的消息给备份服务器,当备份服务器收不到这个消息的时候,即主服务器宕机的时候,备份服务器就会接管虚拟IP,继续提供服务,从而保证了高可用性。
[root@master01 ~]# for master_ip in ${MASTER_IPS[@]}
do
echo ">>> ${master_ip}"
ssh root@${master_ip} "yum -y install curl gcc gcc-c++ make libnl3 libnl3-devel libnfnetlink openssl-devel"
ssh root@${master_ip} "wget http://down.linuxsb.com/software/keepalived-2.2.2.tar.gz"
ssh root@${master_ip} "tar -zxvf keepalived-2.2.2.tar.gz"
ssh root@${master_ip} "cd keepalived-2.2.2/ && LDFLAGS=\"$LDFAGS -L /usr/local/openssl/lib/\" ./configure --sysconf=/etc --prefix=/usr/local/keepalived && make && make install"
ssh root@${master_ip} "systemctl enable keepalived --now && systemctl restart keepalived"
done
提示:如上仅需Master01节点操作,从而实现所有节点自动化安装。若出现如下报错:undefined reference to `OPENSSL_init_ssl’,可带上openssl lib路径:
LDFLAGS="$LDFAGS -L /usr/local/openssl/lib/" ./configure --sysconf=/etc --prefix=/usr/local/keepalived
创建配置文件
对集群相关的组件提前配置,可使用如下脚本定义。
[root@master01 ~]# wget http://down.linuxsb.com/mydeploy/k8s/v1.21.0/k8sconfig.sh #拉取自动部署脚本
[root@master01 ~]# vi k8sconfig.sh
#!/bin/sh
#****************************************************************#
ScriptName: k8sconfig
Author: xhy
Create Date: 2020-06-08 20:00
Modify Author: xhy
Modify Date: 2021-04-16 23:16
Version: v3
#***************************************************************#
set variables below to create the config files, all files will create at ./kubeadm directory
master keepalived virtual ip address
export K8SHA_VIP=172.24.8.100
master01 ip address
export K8SHA_IP1=172.24.8.141
master02 ip address
export K8SHA_IP2=172.24.8.142
master03 ip address
export K8SHA_IP3=172.24.8.143
master01 hostname
export K8SHA_HOST1=master01
master02 hostname
export K8SHA_HOST2=master02
master03 hostname
export K8SHA_HOST3=master03
master01 network interface name
export K8SHA_NETINF1=eth0
master02 network interface name
export K8SHA_NETINF2=eth0
master03 network interface name
export K8SHA_NETINF3=eth0
keepalived auth_pass config
export K8SHA_KEEPALIVED_AUTH=412f7dc3bfed32194d1600c483e10ad1d
kubernetes CIDR pod subnet
export K8SHA_PODCIDR=10.10.0.0
kubernetes CIDR svc subnet
export K8SHA_SVCCIDR=10.20.0.0
[root@master01 ~]# bash k8sconfig.sh
解释:如上仅需Master01节点操作。执行k8sconfig.sh脚本后会生产如下配置文件清单:
- kubeadm-config.yaml:kubeadm初始化配置文件,位于kubeadm/目录
- keepalived:keepalived配置文件,位于各个master节点的/etc/keepalived目录
- haproxy:haproxy的配置文件,位于各个master节点的/etc/haproxy/目录
- calico.yaml:calico网络组件部署文件,位于kubeadm/calico/目录
[root@master01 ~]# vim kubeadm/kubeadm-config.yaml #检查集群初始化配置
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
networking:
serviceSubnet: "10.20.0.0/16" #设置svc网段
podSubnet: "10.10.0.0/16" #设置Pod网段
dnsDomain: "cluster.local"
kubernetesVersion: "v1.21.0" #设置安装版本
controlPlaneEndpoint: "172.24.8.100:16443" #设置相关API VIP地址
apiServer:
certSANs:
- master01
- master02
- master03
- 127.0.0.1
- 172.24.8.141
- 172.24.8.142
- 172.24.8.143
- 172.24.8.100
timeoutForControlPlane: 4m0s
certificatesDir: "/etc/kubernetes/pki"
imageRepository: "k8s.gcr.io"
…… #如下全部注释
#apiVersion: v1
#kind: Secret
#metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard-certs
namespace: kubernetes-dashboard
#type: Opaque
……
kind: Deployment
……
replicas: 3 #适当调整为3副本
……
spec:
containers:
- name: kubernetes-dashboard
image: kubernetesui/dashboard:v2.2.0
imagePullPolicy: IfNotPresent #修改镜像下载策略
ports:
- containerPort: 8443
protocol: TCP
args:
- --auto-generate-certificates
- --namespace=kubernetes-dashboard
- --tls-key-file=tls.key
- --tls-cert-file=tls.crt
- --token-ttl=3600 #追加如上args
……
nodeSelector:
"kubernetes.io/os": "linux"
"dashboard": enable #部署在master节点
……
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: dashboard-metrics-scraper
name: dashboard-metrics-scraper
namespace: kubernetes-dashboard
spec:
type: NodePort #新增
ports:
- port: 8000
targetPort: 8000
nodePort: 30000 #新增
selector:
k8s-app: dashboard-metrics-scraper
……
replicas: 3 #适当调整为3副本
……
nodeSelector:
"beta.kubernetes.io/os": linux
"dashboard": enable #部署在master节点
……
正式部署
[root@master01 dashboard]# kubectl apply -f recommended.yaml
[root@master01 dashboard]# kubectl get deployment kubernetes-dashboard -n kubernetes-dashboard
[root@master01 dashboard]# kubectl get services -n kubernetes-dashboard
[root@master01 dashboard]# kubectl get pods -o wide -n kubernetes-dashboard
提示:master NodePort 30001/TCP映射到 dashboard pod 443 端口。
创建管理员账户
提示:dashboard v2版本默认没有创建具有管理员权限的账户,可如下操作创建。
[root@master01 dashboard]# cat <<eof> dashboard-admin.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin
namespace: kubernetes-dashboard
EOF
[root@master01 dashboard]# kubectl apply -f dashboard-admin.yaml
</eof>
ingress暴露dashboard
创建ingress tls
[root@master01 dashboard]# kubectl -n kubernetes-dashboard create secret tls kubernetes-dashboard-tls --cert=/root/dashboard/certs/tls.crt --key=/root/dashboard/certs/tls.key
[root@master01 dashboard]# kubectl -n kubernetes-dashboard describe secrets kubernetes-dashboard-tls
创建ingress策略
[root@master01 dashboard]# cat <<eof> dashboard-ingress.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
labels:
app: longhorn-manager
name: longhorn-manager
……
imagePullPolicy: IfNotPresent
……
kind: Service
apiVersion: v1
metadata:
labels:
app: longhorn-ui
name: longhorn-frontend
namespace: longhorn-system
spec:
type: NodePort #修改为nodeport
selector:
app: longhorn-ui
ports:
- port: 80
targetPort: 8000
nodePort: 30002
apiVersion: v1
kind: Pod
metadata:
name: longhorn-pod
namespace: default
spec:
containers:
- name: volume-test
image: nginx:stable-alpine
imagePullPolicy: IfNotPresent
volumeMounts:
- name: volv
mountPath: /data
ports:
- containerPort: 80
volumes:
- name: volv
persistentVolumeClaim:
claimName: longhorn-pvc
EOF
</eof>
[root@master01 longhorn]# kubectl apply -f longhornpod.yaml
[root@master01 longhorn]# kubectl get pods
[root@master01 longhorn]# kubectl get pvc
[root@master01 longhorn]# kubectl get pv
Ingress暴露Longhorn
[root@master01 longhorn]# yum -y install httpd-tools
[root@master01 longhorn]# htpasswd -c auth xhy #创建用户名和密码
New password: [输入密码]
Re-type new password: [输入密码]
提示:也可通过如下命令创建:
USER=xhy; PASSWORD=x120952576; echo "${USER}:$(openssl passwd -stdin -apr1 <<< ${PASSWORD})" >> auth
[root@master01 longhorn]# kubectl -n longhorn-system create secret generic longhorn-basic-auth --from-file=auth
[root@master01 longhorn]# cat <<eof> longhorn-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: longhorn-ingress
namespace: longhorn-system
annotations:
nginx.ingress.kubernetes.io/auth-type: basic
nginx.ingress.kubernetes.io/auth-secret: longhorn-basic-auth
nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required '
spec:
rules:
- host: longhorn.odocker.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: longhorn-frontend
port:
number: 80
EOF
</eof>
[root@master01 longhorn]# kubectl apply -f longhorn-ingress.yaml
[root@master01 longhorn]# kubectl -n longhorn-system get ingress
NAME CLASS HOSTS ADDRESS PORTS AGE
longhorn-ingress <none> longhorn.odocker.com 172.24.8.144,172.24.8.145,172.24.8.146 80 45s
</none>
确认验证
浏览器访问:longhorn.odocker.com,并输入账号和密码。
使用xhy/[密码]登录查看。
Helm部署
前置准备
Helm 将使用 kubectl 在已配置的集群上部署 Kubernetes 资源,因此需要如下前置准备:
- 正在运行的 Kubernetes 集群;
- 预配置的 kubectl 客户端和 Kubernetes 集群正确交互。
二进制安装Helm
[root@master01 ~]# wget https://get.helm.sh/helm-v3.5.4-linux-amd64.tar.gz
[root@master01 ~]# tar -zxvf helm-v3.5.4-linux-amd64.tar.gz
[root@master01 ~]# cp linux-amd64/helm /usr/local/bin/
[root@master01 ~]# helm version #查看安装版本
[root@master01 ~]# echo 'source <(helm completion bash)'>> $HOME/.bashrc #helm自动补全
</(helm>
提示:更多安装方式参考官方手册:https://helm.sh/docs/intro/install/。
Helm操作
查找chart
helm search:可以用于搜索两种不同类型的源。
helm search hub:搜索 Helm Hub,该源包含来自许多不同仓库的Helm chart。
helm search repo:搜索已添加到本地头helm客户端(带有helm repo add)的仓库,该搜索是通过本地数据完成的,不需要连接公网。
[root@master01 ~]# helm search hub #可搜索全部可用chart
[root@master01 ~]# helm search hub wordpress
添加repo
[root@master01 ~]# helm repo list #查看repo
[root@master01 ~]# helm repo add brigade https://brigadecore.github.io/charts
[root@master01 ~]# helm repo add stable https://kubernetes-charts.storage.googleapis.com/ #添加官方repo
[root@master01 ~]# helm repo add bitnami https://charts.bitnami.com/bitnami
[root@master01 ~]# helm search repo brigade
[root@master01 ~]# helm search repo stable #搜索repo中的chart
[root@master01 ~]# helm repo update #更新repo的chart
扩展:集群扩容及缩容
集群扩容
- master节点扩容
参考:添加Master节点 步骤 - worker节点扩容
参考:添加Worker节点 步骤
集群缩容
- master节点缩容
[root@master01 ~]# kubectl drain master03 --delete-emptydir-data --force --ignore-daemonsets
[root@master01 ~]# kubectl delete node master03
[root@master03 ~]# kubeadm reset -f && rm -rf $HOME/.kube
- worker节点缩容
[root@master01 ~]# kubectl drain worker04 --delete-emptydir-data --force --ignore-daemonsets
[root@master01 ~]# kubectl delete node worker04
[root@worker04 ~]# kubeadm reset -f
[root@worker04 ~]# rm -rf /etc/kubernetes/admin.conf /etc/kubernetes/kubelet.conf /etc/kubernetes/bootstrap-kubelet.conf /etc/kubernetes/controller-manager.conf /etc/kubernetes/scheduler.conf
Original: https://www.cnblogs.com/itzgr/p/14676860.html
Author: 木二
Title: 附034.Kubernetes_v1.21.0高可用部署架构二
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/607241/
转载文章受原作者版权保护。转载请注明原作者出处!