Kubernetes 高可用集群部署

DevOps

2020-06-17

12

0

机器资源:
Master: 172.16.174.145 d1
node:172.16.174.146 d2
node:172.16.174.147 d3

1.修改主机名
执行以下命令永久修改主机名并配置hosts解析
hostnamectl set-hostname d1
hostnamectl set-hostname d2
hostnamectl set-hostname d3
# 添加 Hosts 解析
[root@d1 ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
172.16.174.145 d1
172.16.174.146 d2
172.16.174.147 d3
127.0.0.1 d1
172.16.174.145 kuber4s.api

2.关闭并禁用防火墙
systemctl stop firewalld
systemctl disable firewalld
3.禁用selinux
setenforce 0
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
4.禁用swap分区并写入开机启动
swapoff -a && echo "swapoff -a" >> /etc/rc.local && chmod +x /etc/rc.local
5.修改系统内核参数关闭iptables6规则
(更多内核调优:https://docs.rancher.cn/rancher2x/install-prepare/best-practices/os.html)
echo "
net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-iptables=1
net.ipv4.ip_forward=1
net.ipv4.conf.all.forwarding=1
net.ipv4.neigh.default.gc_thresh1=4096
net.ipv4.neigh.default.gc_thresh2=6144
net.ipv4.neigh.default.gc_thresh3=8192
net.ipv4.neigh.default.gc_interval=60
net.ipv4.neigh.default.gc_stale_time=120

# 参考 https://github.com/prometheus/node_exporter#disabled-by-default
kernel.perf_event_paranoid=-1

#sysctls for k8s node config
net.ipv4.tcp_slow_start_after_idle=0
net.core.rmem_max=16777216
fs.inotify.max_user_watches=524288
kernel.softlockup_all_cpu_backtrace=1

kernel.softlockup_panic=0

kernel.watchdog_thresh=30
fs.file-max=2097152
fs.inotify.max_user_instances=8192
fs.inotify.max_queued_events=16384
vm.max_map_count=262144
fs.may_detach_mounts=1
net.core.netdev_max_backlog=16384
net.ipv4.tcp_wmem=4096 12582912 16777216
net.core.wmem_max=16777216
net.core.somaxconn=32768
net.ipv4.ip_forward=1
net.ipv4.tcp_max_syn_backlog=8096
net.ipv4.tcp_rmem=4096 12582912 16777216

net.ipv6.conf.all.disable_ipv6=1
net.ipv6.conf.default.disable_ipv6=1
net.ipv6.conf.lo.disable_ipv6=1

kernel.yama.ptrace_scope=0
vm.swappiness=0

# 可以控制core文件的文件名中是否添加pid作为扩展。
kernel.core_uses_pid=1

# Do not accept source routing
net.ipv4.conf.default.accept_source_route=0
net.ipv4.conf.all.accept_source_route=0
net.ipv4.conf.default.promote_secondaries=1
net.ipv4.conf.all.promote_secondaries=1

# Enable hard and soft link protection
fs.protected_hardlinks=1
fs.protected_symlinks=1

# 源路由验证
# see details in https://help.aliyun.com/knowledge_detail/39428.html
net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_announce=2
net.ipv4.conf.all.arp_announce=2

# see details in https://help.aliyun.com/knowledge_detail/41334.html
net.ipv4.tcp_max_tw_buckets=5000
net.ipv4.tcp_syncookies=1
net.ipv4.tcp_fin_timeout=30
net.ipv4.tcp_synack_retries=2
kernel.sysrq=1

" >> /etc/sysctl.conf

接着执行sysctl -p

cat >> /etc/security/limits.conf <<EOF
* soft nofile 65535
* hard nofile 65536
EOF


6.下载IPvs内核模块并安装以备后续开启
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/env bash
ipvs_modules="ip_vs ip_vs_lc ip_vs_wlc ip_vs_rr ip_vs_wrr ip_vs_lblc ip_vs_lblcr ip_vs_dh ip_vs_sh ip_vs_fo ip_vs_nq ip_vs_sed ip_vs_ftp nf_conntrack"
for kernel_module in \${ipvs_modules}; do
/sbin/modinfo -F filename \${kernel_module} > /dev/null 2>&1
if [ $? -eq 0 ]; then
/sbin/modprobe \${kernel_module}
fi
done
EOF
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep ip_vs

7.加载kubernetes的镜像源
cat << EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

8.下载程序所需的一些安装包
yum install -y wget vim lrzsz telnet

9.安装docker服务
yum install -y yum-utils device-mapper-persistent-data lvm2
yum install -y https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/Packages/docker-ce-18.06.3.ce-3.el7.x86_64.rpm

10.更改docker属性配置("bip": 每个节点分配的不一样,d2为172.17.2.1/24,d3为172.17.3.1/24)
mkdir -p /etc/docker
cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["https://q2uvt0x7.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=cgroupfs"],
"storage-driver": "overlay2",
"data-root": "/data/docker",
"storage-opts":["overlay2.override_kernel_check=true"],
"log-driver": "json-file",
"bip": "172.17.1.1/24"
"log-opts": {
"max-size": "100m",
"max-file": "10"
}
}
EOF

11.启动docker服务
systemctl enable docker && systemctl daemon-reload && systemctl start docker
12.下载kubeadm 等kubernetes的安装服务包
yum install -y kubelet-1.18.1 kubeadm-1.18.1 kubectl-1.18.1 ipvsadm ipset
systemctl enable kubelet

=====================以上信息在每台主机执行一遍===========================
=====================以上信息在每台主机执行一遍===========================
=====================以上信息在每台主机执行一遍===========================

13.由于墙的原因我们无法从google上下载kubernetes服务所需镜像,从阿里云镜像站进行下载并打tag改成所需即可
以下安装包已打成tar包进行封存,以备后续使用。
14.k8smaster执行如下信息:
docker pull registry.aliyuncs.com/google_containers/coredns:1.3.1
docker pull registry.aliyuncs.com/google_containers/kube-proxy:v1.18.1
docker pull registry.aliyuncs.com/google_containers/kube-apiserver:v1.18.1
docker pull registry.aliyuncs.com/google_containers/kube-controller-manager:v1.18.1
docker pull registry.aliyuncs.com/google_containers/kube-scheduler:v1.18.1
docker pull registry.aliyuncs.com/google_containers/etcd:3.3.10
docker pull registry.aliyuncs.com/google_containers/pause:3.1
docker tag registry.aliyuncs.com/google_containers/coredns:1.3.1 k8s.gcr.io/coredns:1.3.1
docker tag registry.aliyuncs.com/google_containers/kube-proxy:v1.18.1 k8s.gcr.io/kube-proxy:v1.18.1
docker tag registry.aliyuncs.com/google_containers/kube-apiserver:v1.18.1 k8s.gcr.io/kube-apiserver:v1.18.1
docker tag registry.aliyuncs.com/google_containers/kube-controller-manager:v1.18.1 k8s.gcr.io/kube-controller-manager:v1.18.1
docker tag registry.aliyuncs.com/google_containers/kube-scheduler:v1.18.1 k8s.gcr.io/kube-scheduler:v1.18.1
docker tag registry.aliyuncs.com/google_containers/etcd:3.3.10 k8s.gcr.io/etcd:3.3.10
docker tag registry.aliyuncs.com/google_containers/pause:3.1 k8s.gcr.io/pause:3.1
##################################################
以下两条命令在node上执行:
docker pull registry.aliyuncs.com/google_containers/pause:3.1
docker pull registry.aliyuncs.com/google_containers/kube-proxy:v1.18.1
docker tag registry.aliyuncs.com/google_containers/pause:3.1 k8s.gcr.io/pause:3.1
docker tag registry.aliyuncs.com/google_containers/kube-proxy:v1.18.1 k8s.gcr.io/kube-proxy:v1.18.1
########################################

15.确认d1主机为172.17.1.1 为k8smaster安装:
执行如下命令
pod 网络设置为多少
service 网络地址设置为多少 以上根据CIDR地址划分策略 B类网络已足够使用
kubeadm init --kubernetes-version=v1.18.1 --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --apiserver-advertise-address=172.16.174.145
########################################
初始化需要等待一段时间:以下是显示的部分信息
########################################
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/

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

kubeadm join 172.16.174.145:6443 --token dlm8hs.5rt8ynyw5o50aer9 \
--discovery-token-ca-cert-hash sha256:51aa3c31f0380a4f8200786c9faf0b2d8b6ee4984e707e5f48bcc61db6c3e5d1


以下指令保留进行后续node添加 也可以根据指令重新生成,生成命令如下:
----------------------------------------------------
JOIN_CMD=`kubeadm token create --print-join-command`
${JOIN_CMD} --experimental-control-plane
----------------------------------------------------
保存:
kubeadm join 172.16.174.145:6443 --token dlm8hs.5rt8ynyw5o50aer9 \
--discovery-token-ca-cert-hash sha256:51aa3c31f0380a4f8200786c9faf0b2d8b6ee4984e707e5f48bcc61db6c3e5d1

为普通用户添加 kubectl 运行权限,命令内容在初始化成功后的输出内容中可以看到。
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
建议root用户也进行以上操作,作者使用的是root用户执行的初始化操作,然后在操作完成后查看集群状态的时候,出现如下错误:
The connection to the server localhost:8080 was refused - did you specify the right host or port?
这时候请备份好 kubeadm init 输出中的 kubeadm join 命令,因为将会需要这个命令来给集群添加节点。

15.1 Worker 节点添加到 Kubernetes
请首先确认 Worker 节点满足第一部分的环境说明,并且已经安装了 Docker 和 kubeadm、kubelet 、kubectl,并且已经启动 kubelet。
将 Worker 节点添加到集群,这里注意,执行后可能会报错,有幸的话你会跳进这个坑,这是因为 Worker 节点加入集群的命令实际上在初始化 master 时已经有提示出来了,不过两小时后会删除上传的证书,所以如果你此时加入集群的时候提示证书相关的错误,请执行 kubeadm init phase upload-certs –upload-certs 重新加载证书。
kubeadm join 172.16.174.145:6443 --token dlm8hs.5rt8ynyw5o50aer9 \
--discovery-token-ca-cert-hash sha256:51aa3c31f0380a4f8200786c9faf0b2d8b6ee4984e707e5f48bcc61db6c3e5d1
执行加入操作,你可能会发现卡着不动,大概率是因为令牌ID对此集群无效或已过 2 小时的有效期(通过执行 kubeadm join –v=5 来获取详细的加入过程,看到了内容为 ”token id “0y1dj2” is invalid for this cluster or it has expired“ 的提示),接下来需要在 Master 上通过 kubeadm token create 来创建新的令牌。

15.2 移除 worker 节点
正常情况下,你无需移除 worker 节点,如果要移除,在准备移除的 worker 节点上执行
kubeadm reset -f
或者在 Control-plane 上执行

kubectl delete node nodename

详细安装可以参考官方文档:
https://www.kubernetes.org.cn/7315.html
[root@d3 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
d1 Ready master 18h v1.18.1
d2 Ready node 68m v1.18.1
d3 Ready node 65m v1.18.1
以上即为正常,如角色为none
kubectl label nodes d3 node-role.kubernetes.io/node=
kubectl label nodes d2 node-role.kubernetes.io/node=
kubectl label nodes d1 node-role.kubernetes.io/master=

 

16.部署calico网络插件:
calico可直接拉取 相关镜像无需重新tag
但仍可执行此步骤 为了保障可将镜像进行存档
集群必须安装Pod网络插件,以使Pod可以相互通信,只需要在Master节点操作,其他新加入的节点会自动创建相关pod。
必须在任何应用程序之前部署网络组件。另外,在安装网络之前,CoreDNS将不会启动(你可以通过命令 kubectl get pods –all-namespaces|grep coredns 查看 CoreDNS 的状态)。
# 查看 CoreDNS 的状态,并不是 Running 状态
$ kubectl get pods --all-namespaces|grep coredns
kube-system coredns-7f9c544f75-bzksd 0/1 Pending 0 14m
kube-system coredns-7f9c544f75-mtrwq 0/1 Pending 0 14m

kubeadm 支持多种网络插件,我们选择 Calico 网络插件(kubeadm 仅支持基于容器网络接口(CNI)的网络(不支持kubenet)。),默认情况下,它给出的pod的IP段地址是 192.168.0.0/16 ,如果你的机器已经使用了此IP段,就需要修改这个配置项,将其值改为在初始化 Master 节点时使用 kubeadm init –pod-network-cidr=x.x.x.x/x 的IP地址段,即我们上面配置的 10.244.0.0/16 ,大概在625行左右,操作如下:
# 获取配置文件
mkdir calico && cd calico
wget https://docs.projectcalico.org/v3.8/manifests/calico.yaml

# 修改配置文件
# 找到 625 行左右的 192.168.0.0/16 ,并修改为我们初始化时配置的10.244.0.0/16
vim calico.yaml

# 部署 Pod 网络组件
kubectl apply -f calico.yaml

稍等片刻查询 pod 详情,你也可以使用 watch 命令来实时查看 pod 的状态,等待 Pod 网络组件部署成功后,就可以看到一些信息了,包括 Pod 的 IP 地址信息,这个过程时间可能会有点长。
watch -n 2 kubectl get pods --all-namespaces -o wide

 

17.安装ingress-controller用于 外部访问
安装ingress-controller:
执行以下命令进行文件下载
for file in configmap.yaml namespace.yaml rbac.yaml with-rbac.yaml mandatory.yaml;do wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.24.1/deploy/$file;done
wget https://github.com/kubernetes/ingress-nginx/raw/nginx-0.24.1/deploy/provider/baremetal/service-nodeport.yaml

扩充master 和 node 启动两个ingress-controller pod DNS 解析两个A记录 起到一定的负载均衡的作用
修改文件:
tolerations:
- key: "node-role.kubernetes.io/master"
effect: "NoSchedule"
hostNetwork: true
容忍此污点并开启主机网络80 和 443 方便部署到k8smaster主机节点和k8snode1启动两个pod
执行以下命令,也可放在一个目录下 执行kubectl apply -f ./
kubectl apply -f namespace.yaml
kubectl apply -f configmap.yaml
kubectl apply -f rbac.yaml
kubectl apply -f with-rbac.yaml
kubectl apply -f mandatory.yaml
```
----------------------node执行--------------------------------
node上安装calico然后执行
kubeadm join 192.168.2.200:6443 --token edftt6.pr0e2khsac7q4r31 --discovery-token-ca-cert-hash sha256:f18301e45011a7b27fe58e605c0efbc8284c12a44340a9d6bb744d47ff8e28d0
加入成功后在master上执行kubectl get node进行查看


---------------------Metrics-server部署--------------------------------------
docker pull registry.aliyuncs.com/google_containers/addon-resizer:1.8.1
docker tag registry.aliyuncs.com/google_containers/addon-resizer:1.8.1 k8s.gcr.io/addon-resizer:1.8.1
docker pull registry.aliyuncs.com/google_containers/metrics-server-amd64:v0.3.1
docker tag registry.aliyuncs.com/google_containers/metrics-server-amd64:v0.3.1 k8s.gcr.io/metrics-server-amd64:v0.3.1
编辑文件:metrics-apiservice.yml
metrics-server-dp.yml
metrics-server-rbac.yml
metrics-server-sa.yml
metrics-server-svc.yml
然后执行 kubectl apply -f metrics-apiservice.yml
metrics-server-dp.yml
metrics-server-rbac.yml
metrics-server-sa.yml
metrics-server-svc.yml
kubectl top nodes 查看内存cpu使用量

Kubernetes 高可用集群

1、环境说明

如果你使用的是以上方法部署你的 Kubernetes 集群,想在当前基础上进行高可用集群的创建,则可以按照下面的步骤继续进行。

值得注意的是,这里没有将ETCD放在Master外的机器上,而是使用默认的架构,即官方的 Stacked etcd topology 方式的集群

你需要至少 3 台 Master 节点和 3 台 Worker 节点,或者更多的机器,但要保证是 Master 和 Worker 节点数都是奇数的,以防止 leader 选举时出现脑裂状况。

机器名称 机器IP 工作内容
master01 192.168.115.49 master、etcd
master02 192.168.115.41 master、etcd
master03 192.168.115.42 master、etcd
node01 192.168.115.46 worker
node02 192.168.115.47 worker
node03 192.168.115.48 worker
nfs 192.168.115.50 存储

2、高可用扩展

Kubernetes 的高可用扩展其实挺简单,你只需要将不同的 Master 和 Worker 节点加入到集群中就行了。加入的指令在你初始化集群时已经给出了。

  • 添加 Master 节点:

需要至少 2 个 CPU 核心,否则会报错

kubeadm join kuber4s.api:6443 \
 --token 1hk9bc.oz7f3lmtbzf15x9b \
 --discovery-token-ca-cert-hash sha256:adskfklsdfa232314123klk123b4k231jb4vhb34kj132nk4j123afsadsf23 \
 --control-plane --certificate-key dfadfdsf31213dsf34f4rxcrccdsfceqcdff90jonl1k2klm

  • 添加 Worker 节点

在 Worker 节点上重新执行加入集群命令

kubeadm join kuber4s.api:6443 \
--token 1hk9bc.oz7f3lmtbzf15x9b \
--discovery-token-ca-cert-hash sha256:adskfklsdfa232314123klk123b4k231jb4vhb34kj132nk4j123afsadsf23
 

发表评论

全部评论:0条

lmy233

努力工作学习生活的人呐~~

联系方式

神圣之子仅供学习交流
E-mail:limengyu233@163.com
github:https://github.com/lmy01