k8s-1.16.2集群部署-高可用(三)

接上一篇对k8s-1.17.1集群部署-单主(二),本篇主要讲述k8s集群的高可用。

centos部署k8s集群:(高可用)

1、环境准备:(每台均执行)

系统版本:centos 7.7_1908

Master1:192168.137.132   centos 7.7_1908  hostnamectl set-hostname master1
Master2:192168.137.133   centos 7.7_1908  hostnamectl set-hostname master2
Master3:192168.137.134   centos 7.7_1908  hostnamectl set-hostname master3
Node1:192.168.137.135    centos 7.7_1908  hostnamectl set-hostname test3
Node2:192.168.137.136    centos 7.7_1908  hostnamectl set-hostname test4
echo "127.0.0.1   $(hostname)" >> /etc/hosts

关闭防火墙

systemctl stop firewalld
systemctl disable firewalld

关闭SeLinux

setenforce 0
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config

关闭swap

swapoff -a
yes | cp /etc/fstab /etc/fstab_bak
cat /etc/fstab_bak |grep -v swap > /etc/fstab

内核参数
#如果有配置,则修改

sed -i "s#^net.ipv4.ip_forward.*#net.ipv4.ip_forward=1#g"  /etc/sysctl.conf
sed -i "s#^net.bridge.bridge-nf-call-ip6tables.*#net.bridge.bridge-nf-call-ip6tables=1#g"  /etc/sysctl.conf
sed -i "s#^net.bridge.bridge-nf-call-iptables.*#net.bridge.bridge-nf-call-iptables=1#g"  /etc/sysctl.conf

#可能没有,追加

echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
echo "net.bridge.bridge-nf-call-ip6tables = 1" >> /etc/sysctl.conf
echo "net.bridge.bridge-nf-call-iptables = 1" >> /etc/sysctl.conf
sysctl -p  #使配置生效

安装nfs,必须先安装 nfs-utils 才能挂载 nfs 网络存储

yum install -y nfs-utils
yum install -y wget

2、安装docker和k8s:(master和node上均安装)

Docker版本:18.09.7
kubernetes版本:1.16.2

参考文档如下
https://docs.docker.com/install/linux/docker-ce/centos/
https://docs.docker.com/install/linux/linux-postinstall/

1)安装 docker

k8s-1.17.1集群部署-单主(二)中docker安装

2)安装 k8s

k8s-1.17.1集群部署-单主(二)中k8s安装,唯一不同是将 kubelet,kubeadm,kubectl的版本由1.17.1改为1.16.2

yum install -y kubelet-1.16.2 kubeadm-1.16.2 kubectl-1.16.2

3、初始化apiserver

1)创建Apiserver的load Balancer(私网)

监听端口:6443/TCP
后端资源组:包含demo-master1,demo-master2,demo-master3
后端端口:6443
开启按源地址保持回话
假设完成创建以后,load balance的ip地址为*...*
根据每个人实际的情况不同,实现 LoadBalancer 的方式不一样,本文不详细阐述如何搭建 LoadBalancer,请读者自行解决,可以考虑的选择有:
nginx
haproxy
keepalived
云供应商提供的负载均衡产品

2)初始化第一个master的节点

注意:初始化节点时,如果因为中间的某些步骤配置出错,想要重新初始化master节点时,请先执行kubeadm reset命令。

关于初始化时用到的环境变量:

  1. APISERVER_NAME不能为master的hostname
  2. APISERVER_NAME必须全为小写字母、数字、小数点,不能包括减号
  3. POD_SUBNET所使用的网段不能与master节点和node节点所有在网点重叠,该字段值选取一个CIDR值,如果您对 CIDR 这个概念还不熟悉,请不要修改这个字段的取值 10.100.0.1/16
export APISERVER_NAME=apiserver.demo    #替换apiserver.demo为你想要的dnsName
export POD_SUBNET=10.100.0.1/16 && echo "127.0.0.1 ${APISERVER_NAME}" >> /etc/hosts  #Kubernetes 容器组所在的网段,该网段安装完成后,由kubernetes创建,事先并不存在于你的物理网络中
curl -sSL https://kuboard.cn/install-script/v1.16.2/init_master.sh | sh

若执行失败后,请执行:

kubeadm reset
rm -rf /var/lib/etcd
curl -sSL https://kuboard.cn/install-script/v1.16.2/init_master.sh | sh
1> 执行结果

在这里插入图片描述

2> 检查master初始化结果

Pod还没有完全起来,起来之后就会变成Ready;直到所有的pod起来之后才可以进行下一步操作
在这里插入图片描述

3> 初始化第二个、第三个节点
方法一:和第一个master节点一起初始化

<1> 获取master节点的join命令,执行上面执行结果中“只对master节点有效”的命令
<2> 在master2和master3上执行

kubeadm join apiserver.demo:6443 --token jlg06f.faa69e1fx8h43wax \
    --discovery-token-ca-cert-hash sha256:23f55a573ea0a49c4bd369127f6ae0adc37b2d37fb7f6d262049c194e7e01c1d \
--control-plane --certificate-key 80d852ed6ee53b7f76b605255fd92bc691210faeb03dc474b90a5d3e098da244

在这里插入图片描述

方法二:第一个master节点初始化2小时之后再初始化

<1> 获取获得 certificate key(在master1上执行)
kubeadm init phase upload-certs --upload-certs
在这里插入图片描述
<2> 获取join命令

kubeadm token create --print-join-command
kubeadm join apiserver.demo:6443 --token mpfjma.4vjjg8flqihor4vt     --discovery-token-ca-cert-hash sha256:6f7a8e40a810323672de5eee6f4d19aa2dbdb38411845a1bf5dd63485c43d303

<3> 在master2和master3上执行

export APISERVER_NAME=apiserver.demo
echo "${APISERVER_IP}    ${APISERVER_NAME}" >> /etc/hosts
kubeadm join apiserver.demo:6443 --token mpfjma.4vjjg8flqihor4vt     --discovery-token-ca-cert-hash sha256:6f7a8e40a810323672de5eee6f4d19aa2dbdb38411845a1bf5dd63485c43d303

<4> 如果在一直停留在pre-flight状态,请在第二、三个节点上执行命令检查

curl -ik https://apiserver.demo:6443/version

输出结果应该如下:

HTTP/1.1 200 OK
Cache-Control: no-cache, private
Content-Type: application/json
Date: Wed, 30 Oct 2019 08:13:39 GMT
Content-Length: 263
{
  "major": "1",
  "minor": "16",
  "gitVersion": "v1.16.2",
  "gitCommit": "2bd9643cee5b3b3a5ecbd3af49d09018f0773c77",
  "gitTreeState": "clean",
  "buildDate": "2019-09-18T14:27:17Z",
  "goVersion": "go1.12.9",
  "compiler": "gc",
  "platform": "linux/amd64"
}

否则需要检查下Loadbalancer 是否设置正确
<5> 检查master的初始化结果

kubectl get nodes

4、初始化work节点

1)方法一:和第一个master节点一起初始化

<1> 获取join参数命令,执行上面执行结果中“只对work节点有效”的命令

kubeadm join apiserver.k8s:6443 --token 4z3r2v.2p43g28ons3b475v \
--discovery-token-ca-cert-hash sha256:959569cbaaf0cf3fad744f8bd8b798ea9e11eb1e568c15825355879cf4cdc5d6

<2> 在worker上执行

export MASTER_IP=x.x.x.x              #x.x.x.x 为 ApiServer LoadBalancer 的 IP 地址
export APISERVER_NAME=apiserver.demo  #替换 apiserver.demo 为初始化 master 节点时所使用的 APISERVER_NAME
echo "${MASTER_IP}  ${APISERVER_NAME}" >> /etc/hosts

#替换为前面 kubeadm token create --print-join-command 的输出结果

kubeadm join apiserver.demo:6443 --token mpfjma.4vjjg8flqihor4vt     --discovery-token-ca-cert-hash sha256:6f7a8e40a810323672de5eee6f4d19aa2dbdb38411845a1bf5dd63485c43d303
2)方法二:第一个master节点初始化2小时之后再初始化
1> 获取join命令
kubeadm token create --print-join-command  #只在第一个master节点demo-master-a-1上执行
kubeadm join apiserver.demo:6443 --token mpfjma.4vjjg8flqihor4vt     --discovery-token-ca-cert-hash sha256:6f7a8e40a810323672de5eee6f4d19aa2dbdb38411845a1bf5dd63485c43d303
2> 执行join命令
export MASTER_IP=x.x.x.x   #替换 x.x.x.x 为 ApiServer LoadBalancer 的 IP 地址
export APISERVER_NAME=apiserver.demo # 替换 apiserver.demo 为初始化 master 节点时所使用的 APISERVER_NAME
echo "${MASTER_IP}    ${APISERVER_NAME}" >> /etc/hosts
kubeadm join apiserver.demo:6443 --token mpfjma.4vjjg8flqihor4vt     --discovery-token-ca-cert-hash sha256:6f7a8e40a810323672de5eee6f4d19aa2dbdb38411845a1bf5dd63485c43d303  #替换为前面 kubeadm token create --print-join-command 的输出结果
3)检查worker初始化结果

在第一个master节点上执行

kubectl get nodes
4)移除worker节点
kubeadm reset                        #在准备移除的 worker 节点上执行
kubectl delete node demo-worker-x-x  #在第一个 master 节点上执行

5、安装 calico 网络插件

k8s-1.17.1集群部署-单主(二)中安装 calico 网络插件

6、k8s安装客户端

由于所有节点上已经安装了kubectl;若未安装,则参考如下:

1)配置K8S的yum源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
       http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
yum install -y kubectl   #安装kubectl
kubectl version          #验证安装
2)获取 kubectl config 文件
cat /etc/kubernetes/admin.conf

注意红框内的域名需要在客户端机上配置
在这里插入图片描述

3)配置 kubectl 客户端(或者将master上的config文件scp到目标主机即可)
mkdir ~/.kube   
scp  ~/.kube/config 192.168.171.139:~/.kube/ 
scp  ~/.kube/config 192.168.171.149:~/.kube/

或者将/etc/kubernetes/admin.conf 文件的内容粘贴进该文件并保存

4)配置hosts
echo "x.x.x.x    apiserver.demo" >> /etc/hosts   # x.x.x.x为master的ip

在这里插入图片描述

5)验证
kubectl get nodes
kubectl get pods -n kube-system

在这里插入图片描述

7、k8s安装dashboard

1)下载官方yaml文件
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta8/aio/deploy/recommended.yaml     #最新的配置文件v2.0.0-beta8版本recommended.yaml
2)修改yaml文件

官方的kubernetes-dashboard.yaml文件中service的type类型为clusterIp(service默认类型),这种方式要访问dashboard需要通过代理,所以我们改为NodePort方式,这样部署完后,就可以直接通过nodeIP:port的方式访问
在这里插入图片描述

3)下载镜像和启动
docker pull kubernetesui/dashboard:v2.0.0-beta8   #可跳过

在这里插入图片描述

kubectl apply -f recommended.yaml

在这里插入图片描述
查看pod和状态
在这里插入图片描述

4)浏览器访问
1> 选择用默认用户kubernetes-dashboard的token登陆,查看serviceaccount和secrets
kubectl  get sa,secrets -n kubernetes-dashboard

在这里插入图片描述

2> 查看token
kubectl describe secrets kubernetes-dashboard-token-vb8r8 -n kubernetes-dashboard

在这里插入图片描述
或者一行命令直接获取token

kubectl describe secrets  $(kubectl  get secrets -n kubernetes-dashboard | awk  '/kubernetes-dashboard-token/{print $1}' ) -n kubernetes-dashboard |sed -n '/token:.*/p'
3> 浏览器上输入master节点https://192.168.171.129:30001

用上面得到的token登陆之后,界面上数据显示不出来
并提示权限不足
在这里插入图片描述
解决办法如下:参考链接

4> 新增管理员用户
方法一:通过yaml文件

cat create-admin.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 create-admin.yaml
kubectl get sa,secrets -n kubernetes-dashboard

在这里插入图片描述

kubectl describe secret admin-user-token-t79xh -n kubernetes-dashboard

在这里插入图片描述

方法二:命令行创建
kubectl create serviceaccount admin-myuser -n kubernetes-dashboard  #创建serviceaccount
kubectl create clusterrolebinding  dashboard-cluster-admin --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:admin-myuser   #sa绑定集群管理员

在这里插入图片描述

kubectl describe secret admin-myuser-token-x5n7r -n kubernetes-dashboard  #查看token

在这里插入图片描述

5)再次登陆验证

在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值