1 环境装备

1.1 节点预备

体系类型 IP地址 节点人物 CPU Memory Hostname
centos-7.3 192.168.3.180 master >=2 >=2GB mastegithubr1
centos-7.3 192.168.3.112 master >=2 >=2GB master2
centos-7.3 192.168.3.183 master >=2 >=2json怎样读GB masterHTTPS3
centos-7.3 192.168.3.182 worknginx怎样读er >=2 >=2GB worker1
centos-7.3 192.168.3.181 worker &gnginx发动指令t;=2 >=2GB worker2

1.2 节点装备

设置主机名:主机名有必要每个节点都不相同,而且保证悉数点之间能够经过hostname彼此拜访。

# 检查主机名
$ hostname
# 修正主机名
$ hostnamectl set-hostnanginx反向代理me <your_hostname>
# 装备host,使悉数节点之间能够经过hostnadocker容器me彼此拜访

docker指令正host文件

$ vi /etc/hosts
# <node-ip> <node-hostname>

设备依托

# 更新yum
$ yum update
# 设备依托包
$ yum install -y conntrackhttps和http的差异 ipvsadm ipset jq sysstat curl iptables libseccomp

其他装备

# 关闭防火墙
$ systemctl stonginx菜鸟教程p firewalld && systemctl disable firewalld
# 重置iptables
$ iptdockersables -F && iptables -docker常用指令X && iptables -F -t nat &&ampHTTPS; iptabgithub永久回家地址les -X -t nat && iptables -P FOJSONRWARD ACCEPT
# 关闭swap
$ swapoff -a
$ sed -i '/swap/s/^(.*)$/json格局怎样翻开#1/g' /etc/fstab
# 关闭selinux
$ setenforce 0
# 关闭dnsmasq(不然或许导致docker容器无法解析域名)
$ service dnsmasq stgitlabop && systemctl disable dnsmasq

体系参数装备

# 制作装备文件
$ cat > /etc/sysctl.d/kubernetes.cogit指令nf <<EOF
net.bridge.bridge-nf-call-ijsonptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
vm.swappiness=0
vm.overcommit_memory=1
vDockerm.panic_on_oom=0
fs.inotify.max_user_watches=89100
EOF
# 收效文github敞开私库件
$ sysctl -p /etc/sysctl.d/kubernetes.chttps安全问题onf

坑1:cannot stat /proc/sys/nnginx面试题et/bridge/bridge-nf-call-iptables: No such file or directory

解决方法:monginx发动指令dprobe br_netfilter

2 设dockers备Docker

$ yum install https://download.djson是什么意思ocker.com/linuxgit教程/centos/7/x86_64/stable/Pacdocker面试题kages/docker-ce-selinux-17.03.1.ce-1.el7.centos.noadocker容器rch.rpm
$ yum install https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-17.03.1.ce-1.el7.centos.x86_64.rpm
# 开机建议
$ systemctl enable docker
# 设置参数
# 1.检查磁盘挂载
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2        98G  2.8G   95G   3% /
devtmnginx防火墙pfs         63https认证G     0   63G   0% /dev
/dev/sda5      1015Gdocker指令  8.8G 1006G   1% /tdockersol
/dev/sda1       197M  161M   37M  82% /boot
# 2json是什么意思.设置docker建议参git指令数
# -json文件是干什么的 设置djson转mapocker数据目录:选择比较大的分区nginx负载均衡(我这儿是根目录就不需求装备了,默以为/var/lib/docker)
# - 设https域名置cgrjson转mapoup driver(默认是cgroupfs,首要目的是与kubelet装备统一,这儿也能够不设置后边在kubelet中https认证指定cgrojson转mapupfs)
$ cat <<EOF > /nginx负载均衡etc/docker/daemon.json
{
"graph": "/dockjson解析er/data/path",
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
# 建议docker服务
sdocker容器ervice docker restartjson解析

3 设备东西

# 装备yum源
$ cat <<EOF > /etc/yum.repjson转mapos.d/kubernetes.repo
[kubernetes]
nagitlabme=Kubernetes
baseurl=http://mirrors.aliyun.com/nginx菜鸟教程kuberneteshttps认证/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.github敞开私库aliyun.com/kubernetes/yum/doc/docker容器yum-key.gpg
http://mirrors.aliyundocker常用指令.com/kubedocker装置布置rnetes/yum/doc/rpm-package-key.gpg
EOF
# 设备东西
# 找到要设备的版别号
$ yum list kubeadm --showduplicateshttps协议 | sort -r
# 设备指定版别(这儿用的是1.14.0)
$ yum install -y kubeadm-1.14.docker容器0-0 kubelet-1.14.0-0 kubegit教程ctl-1.14.0-0 --disableexcludes=kubernetes
# 查找knginx是什么意思ubelet.service.d的方位
$ find / -name "kubelet*"
# 设置kubelet的cgroupdriver(kubelet的cgroupdriver默以为systemd,假如上面没有设置docker的exec-opts为systemd,这儿就需求将kubelet的设置为cgroupfs)
$ sed -i "s/cgroup-driver=systemd/cgroup-driver=cgroupfs/g" /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
# 建议kubelet
$ systemctl enable kubjson转mapelet && systemctl start kubelet

坑2:短少依托yum -y install kubernetes-cni = 0.7.5

4 预备装备文件(Master1)

$ cd ~ && git clone https://gitee.com/admxj/kubernetes-ha-kubnginx负载均衡战略eadm.git
addondocker指令s:kubernetes的插件,比方calico和dashboard。

configs:包含了安顿集群进程中json转map用到的gitlab各种装备文件。

scripts:包含安顿集群进程中用到的docker和虚拟机的差异脚本,如keepalive检查脚本。

global-configs.properties:全局装备,包含各种易变的装备内docker装置布置容。

init.sh:初始化脚本,装备好global-confdocker面试题ig之后,会主动生成悉数装备文件。

#kubernetedocker常用指令s版别
VERSION=v1.14.0
#POD网段
POD_CIDR=172.22.0.0/16
#master虚拟ip
MASTER_VIP=192.json文件是干什么的168.8.188
#keepalived用到的网卡接口名
VIP_IF=ens33
# 生成装备文件,保证实施进程没有失常信息
$ ./init.sh
# 检查生成的装备文件,保证脚gitlab本实施成功
$ find target/ -typhttps安全问题e f

坑3:-bash: ./init.sh: Permission denied

chmod 777 init.shjson

[root@jxd-master1 kubernetes-ha-kubeadm]# ./init.sh
====替换变量列表====
VERSION=v1.14.0
POD_CIDR=172.22.0.0/16
MASTER_VIP=192.168.3.199
VIP_nginx面试题IF=ens1
====github永久回家地址替换脚本====
scriptnginx怎样读s/check-apiservejsonpr.sh
====替换装备文件====
configsnginx发动指令/keepalived-backup.conf
configs/keepalived-master.conf
configs/kubeadm-config.yaml
adocker容器ddons/calico-rbac-kdd.yaml
addons/calico.yaml
addons/dashboard-all.yJSONaml
装备生成成功,方位: /root/kubernetenginx怎样读s-ha-kubeadm/target

5 建立高可用集群(Master1、Master2)

Master1作为主节点nginx负载均衡,Master2作为备用节点

5.1 设备keepalived

yum install -y kehttps和http的差异epalived

创立keepalived装备文件,运用xsnginx怎样读hell东西将指令发送到gitlab悉数会话

# 创立目录
$ mkdir -p /etc/keepalived
# 分发装备文github永久回家地址件
$ cp target/configs/keepalived-mgithub永久回家地址aster.cdocker指令onf /etc/keepalived/keepalived.conf
# 分发监测脚本
$ cp target/scripts/check-aphttps域名iserver.sh /etc/keepalived/

keepalived装备文件:

! Configuration Fidocker和虚拟机的差异le for keepalived
global_docker菜鸟教程defs {
router_id keepalive-master
}
vrrp_script check_apiserver {
script "/etc/keepalived/check-apisenginx菜鸟教程rver.github中文官网网页sh"
interval 3docker和虚拟机的差异 # 每隔3s实施一次
weight -2 # 权重-2
}
vrrp_instance VI-kube-master {
state MASTER
interface ens1
virtual_rouJSONtedocker是干什么的r_id 68
priority 100
dontnginx面试题_track_primary
advert_int 3
virtual_ipaddress { # api sergithub永久回家地址ver
192.168.3.199
}
track_script { # 检查的脚本
check_apisernginx菜鸟教程ver
}
}

5.2 建议keepalived

# 分别在master和bajson格局ckup上建议服务
$ syDockerstemctl enable keepgithub永久回家地址alived && service keepalived start
# 检查状况
$ service keepalived sdocker面试题tatus
# 检查日志
$ journagiti轮胎是什么品牌lctl -giti轮胎是什么品牌f -dockerfileu keepajson文件是干什么的lived
# 检查虚拟inginx反向代理p
$ ip a

keepalived.service处于activdocker容器e的状况https认证
【Kubernetes】实战记载:集群建立

虚拟IP绑定到了eth1网卡上
【Kubernetes】实战记载:集群建立

能够ping通虚拟IP
【Kubernetes】实战记载:集群建立

5.3 安顿第一个主节点

# 预备装备文件
$ cp target/configs/kubeadm-config.docker和虚拟机的差异yaml ~
# ssh到第一个主节点,实施kubeadm初始化体系(留心保存终究打印的参加集群的指令)
$ kubeadm init --config=kubeadmnginx菜鸟教程-config.yaml --experimental-upload-certs

# copy kubectl装备(上一步会github敞开私库有提示)
$ mkdir -p ~/.kube
$ cp -json文件是干什么的i /etchttps域名/kubernetes/admin.conf ~/.kube/config

# 查验一下kubectl
$ kubectl get pods --all-namespaces

留心:需求将init打印的githubjoin指令保存下来,之后参加worker节点的dockers时分需求运用到。

kubeadm join 192.168.3.199:6443 --token 8qn6rx.rnariugyxjsd642z 
--discovery-token-caNginx-cert-haHTTPSsh sha256:4fd89120cc158a17b9bb898a1cebb879dba88795904a4b9c7de8f66718effa9d 
--experimental-control-plane --certificate-key 1d18e633630307ac7d4b8ca7c8bec4dbb03fba7be7e6b6270a101fca4d21e651

坑4:kbeadm初始化体系,报错:版别不匹配

error execution phase preflight: [preflijsonp跨域原理ght] Some fatal errors occurred:
[ERROR KubeletVersion]: the kubelet version is highdockerser than the control plane versgiti轮胎是什么品牌ion. This is not a suJSONpported version skew and may lead to a malfunctional cluster. Kubelet version: "1.20.5" Control plane version: "1.14.0"
[preflighgithub永久回家地址t] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`

解决方法:从头设备kubelet(奇怪的是之前设备的时分清楚指定了kubelet的版别

yum -y remove kubelet
yum -y install kubelet-1.14.0 kubeadm-1.14.0

【Kubernetes】实战记载:集群建立
dns是pending状况,其他都是running状况,因为dns是作业在作业节点上Docker的。

运用cugiteerl指令恳求docker面试题一下健康检查接口,回来ok代表没问题

[root@jxdgiti轮胎是什么品牌-master1 ~]# curl -k httgithub敞开私库ps://192.168.3.199:6443/healthz
ok

6 仿制装备文件

其他节点需求用到的证书文件docker指令:/etc/kubernetes/adminnginx面试题.conf & /etc/kubernetes/pki

  • ca.crgitit
  • ca.key
  • sa.key
  • sa.pub
  • front-proxy-ca.crt
  • front-proxy-ca.key
  • ca.crt
  • ca.key

仿制主节点的github文件到其他节点:scp -r root@jxd-masnginx负载均衡战略ter1:/etc/kubernetes/pki/ . scdocker常用指令p root@jxd-master1:/etc/kubernetes/admjsonp跨域原理in.conf .
删去其他文件:

[root@jxd-master2 pki]# rmHTTPS -f apiserver*
[root@jxd-master2 pki]# rm -f front-proxy-jsonpclient.*
[rootdockers@jxd-master2 pdockerski]# rm -f etcd/healthcheck-client.* etcd/peer.* etcd/server.*

7 安顿第二个主节点

第二个主节点的装备脚本文件:/root/kubernetes-ha-kubeadm/target/scripjson转mapts/init-master-https和http的差异second.sh

!/bin/bash
# kubelet 引导装备
kubeadm alpha phase certs all --config kubeadm-config.yaml
kubdockerfileeadm alpha phase kubelet config write-to-disk --config kubeadm-config.yamljsonp跨域原理
kubeadm alpha pjsonp跨域原理hase kubelet write-env-file --config kubeadm-config.yaml
kubeadm alpha phase kubeconfig kubelet --config kubeadm-config.yaml
snginx发动指令ystemctl start kubelet
sleep 2
# 参jsonp与etcd集群
export KUBECONFIG=/etc/kubernetes/admin.conf
kubectl exec -n kube-system etcd-jxd-master1 -- etcdctl --cd-file /etc/kubernetes/pki/etcd/ca.crt --cert-file /etc/kubernetes/pki/etcd/peer.crt --key-file /etc/kubernetes/pki/etcd/peer.key --endpoints=https://192.168.3.180:2379 member add jxd-master2 https://192.168.3.112:2380
sleep 2
kubeadm alpha phajson解析se etcd local --conhttps域名fig kubeadm-condockersfig.yaml
sleep 3
# 安顿主节点组件
kubeadm alpha phajsonse kubeconfig all --config kubeadm-cjson文件是干什么的onfig.yaml
kubeadm alpha phase controlplane all --config kubeadm-config.yaml
kubeadm alpha phase mark-nginx防火墙master --config kubeadm-config.yaml

【Kubernetes】实战记载:集群建立

# 上传生HTTPSGit的初始化脚本
$ scp target/scripts/init-master-second.sh root@jxd-master2:~
# 在第二个master节https协议点实施初始化脚本
init-master-second.sh
# 检查节点作业状况
$ netstat -ntlp
$ docker ps
$ journalctl -f
# 装备kubectl
$ mkdir -p ~/.kubgithub敞开私库e
$ mv /etc/HTTPSkubernetes/admin.conf ~/.kube/config

8 安顿网络插件

[root@jxd-master1 addons]#nginx菜鸟教程 kubectl apply -f /etc/kubernetes/adgit指令dons/calnginx负载均衡战略ico-rbac-https安全问题kdd.yaml
[root@jxddockers-master1 addons]# kubectl apply -f /etc/kubernetes/addoHTTPSns/calico.yaml

检查作业状况:
【Kubernetes】实战记载:集群建立

9 参加worker节点

# 运用之前保存的join指令参加集群
$ kubeadm join 192.168.3.199:6443 --tokennginx菜鸟教程 8qn6rx.rnariugygithubxjsd642z 
--discovery-token-cadocker容器-cert-hash sha256:4fd891docker和虚拟机的差异20cc158a17b9bb898a1cebb879dba88795904a4b9c7de8f66718effa9d 
--experimental-control-plane --certificate-key 1d18e633630307ac7d4b8ca7c8bec4dbb03fba7be7e6b6270a101fca4d21ehttps协议651
# 耐性等待一会,并查询日志
$ journalctl -f
# 检查节点
$ kubectl get nodes

坑:the server doesn’t have a resource type “nodes”

runginx发动指令n:kubectl get nodes
ERROnginx防火墙R:
the server doesn't have a resoujson格局rce type "nodes"
解决方法:
sudo cp /etc/kubernetes/admin.conf ~/.kube/confnginx发动指令ig

坑:Unable to connect to the server: x509: certificate signgiti轮胎是什么品牌ed by unknowgit指令n authority (possinginx负载均衡战略bly because of “crypto/rsa: venginx菜鸟教程rification error” while trying to verify candidate authority certificate “kubernetes”)

解决方法:bgiteelog.csdn.net/woadockerfiley2008/ar…

10 集群可用性查验

10.1 创立nginx ds

 # 写入装备
$ cat > nginx-ds.yml <<EOF
apiVersion: v1
kind: Segitlabrvice
metadata:
name: nginx-ds
labels:
app: nginx-ds
spec:
type: NodePort
selector:
app: nginx-ds
ports:
- name: http
port: 80
targetPort: 80
---
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
name: nginx-ds
labels:
addonmanager.kubernetes.io/mode: Reconcile
spec:
template:
metadata:
labels:
app: nginx-ds
spec:
containers:
- name: mgit指令y-nginx
image: nginxdocker面试题:1.7.9
ports:
- containerPort: 80
EOF
# 创立ds
$ kubectl create -f nginxnginx面试题-ds.yml

10.2 检查连通性

# 检查各 Nodjson文件是干什么的e 上的 Pod IP 连通性
$ kubectl get pods  -o wide
# 在每个节点上ping pod ip
$ ping <pod-ip>
# 检查service可达性
$ kubectl get svc
# 在每个节点上拜访服务
$ curlhttps域名 <senginx防火墙rvice-ip>:<port>
# 在每个节点检查node-port可用性
$ curhttps域名l <node-ip>:<port>

10.3 检查DNS可用性

# 创立一个nginxdockers pod
$ cat > pod-nginx.yaml <<EOF
apiVnginx发动指令ersion: v1
kind: Pod
medocker常用指令tadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPDockerort: 80
EOF
# 创立pod
$ kubectl create -f pod-nginx.yaml
# 进入pod,检查dnsjson格局怎样翻开
$ kubectl exec  nginx -i -t -- /bin/bash
# 检查dns装备
root@nginx:/# cat /etc/resolv.confgithub
# 检查姓名是否能够正确解析
root@nginx:/# ping nginx-ds

参考资料

  • 集群实践环json解析境预备
  • 建立高可用集群
  • 集群可用性查验
  • Kubernetes(k8s)出产级实践攻略从安顿到中心使用