文章目录
- 一、kind配置HA高可用集群
- 1.配置文件
- 2.创建集群
- 3.查看集群信息
- 4.查看集群节点列表
- 5.部署nginx服务
- 5.1 加载镜像到集群
- 5.2 查看集群镜像是否存在
- 5.3 部署
- 二、节点的添加
- 1.master节点添加到cluster
- 1.1 同步证书文件
- 1.2 其他master加入集群
- 2.将node节点添加到cluster
- 1.master节点添加到cluster
- 总结
一、kind配置HA高可用集群
k8s普通搭建出来只是单master节点,如果该节点挂掉,则整个集群都无法调度,K8s高可用集群是用多个master节点加负载均衡节点组成,外层再接高可用分布式存储集群例如ceph集群,实现计算能力 存储能力的高可用,同时,etcd也可以独立出来用外部的etcd集群。因为存手工部署k8s高可用集群比较麻烦,所以使用kind来部署。
Kubernetes集群组件主要有如下:
- etcd 一个高可用的K/V键值对存储和服务发现系统
- flannel 实现夸主机的容器网络的通信
- kube-apiserver 提供kubernetes集群的API调用
- kube-controller-manager 确保集群服务
- kube-scheduler 调度容器,分配到Node
- kube-proxy 提供网络代理服务
- kubeadm:用来初始化集群的指令
- kubectl: 用来与集群通信的命令行工具。通过kubectl可以部署和管理应用,查看各种资源,创建、删除和更新各种组件
- kubelet 运行在集群中的每个节点上,用来启动 pod 和 container 等
k8s集群高可用,一般是etcd、kube-apiserver、kube-controller-manager、kube-scheduler服务组件的高可用。
1.配置文件
kind-example-config.yaml配置案例如下:
代码语言:javascript复制kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: control-plane
- role: worker
- role: worker
2.创建集群
代码语言:javascript复制kind create cluster --name yg-ha --config kind-ha.yml
3.查看集群信息
代码语言:javascript复制kubectl cluster-info --context yg-ha
4.查看集群节点列表
代码语言:javascript复制kubectl get nodes
5.部署nginx服务
5.1 加载镜像到集群
代码语言:javascript复制kind load docker-image nginx:1.12 --name yg-ha
5.2 查看集群镜像是否存在
代码语言:javascript复制docker exec -it yg-ha-control-plane bash
crictl img
5.3 部署
使用下方代码创建一个 nginx.yml
文件,然后使用 kubectl apply -f nginx.yml
就可以完成部署了
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.12
ports:
- containerPort: 80
查看当前 deployment 的状态
代码语言:javascript复制kubectl get deployment
查看pod运行详细信息
代码语言:javascript复制kubectl get nodes -o wide
由于我们没有做服务暴露,所以是不能直接访问对应的服务的,我们可以用 kubectl提供的端口转发功能来讲流量从本地转发给 k8s 集群
代码语言:javascript复制kubectl port-forward nginx-deployment-84fc49578f-28sth 30080:80
访问nginx地址:http://localhost:30080
二、节点的添加
1.master节点添加到cluster
1.1 同步证书文件
将node1证书文件复制到其他master节点node2,node3
代码语言:javascript复制for host in node2 node3
do
echo ">>>>>>>>>>>>>>>>>>>>$host<<<<<<<<<<<<<<<<<<<<<"
ssh $host "mkdir -p /etc/kubernetes/pki/etcd"
scp /etc/kubernetes/pki/ca.* $host:/etc/kubernetes/pki/
scp /etc/kubernetes/pki/sa.* $host:/etc/kubernetes/pki/
scp /etc/kubernetes/pki/front-proxy-ca.* $host:/etc/kubernetes/pki/
scp /etc/kubernetes/pki/etcd/ca.* $host:/etc/kubernetes/pki/etcd/
scp /etc/kubernetes/admin.conf $host:/etc/kubernetes/
done
1.2 其他master加入集群
查看master的token
代码语言:javascript复制kubeadm token list | grep authentication,signing | awk '{print $1}'
查看discovery-token-ca-cert-hash
代码语言:javascript复制openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
注意:token有效期是有限的,如果旧的token过期,可以使用kubeadm token create --print-join-command重新创建一条token。
分别在master1和master2 执行下面的命令来加入集群,注意要修改token和ca-cert-hash为上面查询出来的结果
代码语言:javascript复制kubeadm join 130.252.10.233:8443 --token abcdef.0123456789abcdef
--discovery-token-ca-cert-hash sha256:4d95989174b67c857bed7313750e021f07ec56beb2e6e764c7ef2de5645187e9
--experimental-control-plane --ignore-preflight-errors=Swap
mkdir -p $HOME/.kube
代码语言:javascript复制cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
2.将node节点添加到cluster
代码语言:javascript复制kubeadm join 130.252.10.233:8443 --token abcdef.0123456789abcdef
--discovery-token-ca-cert-hash sha256:4d95989174b67c857bed7313750e021f07ec56beb2e6e764c7ef2de5645187e9
--ignore-preflight-errors=Swap
总结
kind 在创建集群的时候实际上使用的是 kubeadm 所以还可以修改 kubeadm 的配置来修改默认的镜像地址,节点标签污点等信息,除此之外还可以配置 PV/PVC CNI 插件等配置,如果有需求的话可以查阅 kind 的官方文档
不过要注意的是 kind 不支持给运行的集群添加节点,如果需要多节点集群的话得提前规划好节点数量或者使用Karmada,Karmada是依赖于kind 创建集群的,基于kind的再次封装可以支持节点的加入。