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 &&HTTPS; 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认证
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
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
# 上传生HTTPS成Git的初始化脚本
$ 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
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)出产级实践攻略从安顿到中心使用