Kubernetes集群幾種部署方式
minikube
Minikube是一個(gè)工具,可以在本地快速運(yùn)行一個(gè)單點(diǎn)的Kubernetes,嘗試Kubernetes或日常開(kāi)發(fā)的用戶使用。不能用于生產(chǎn)環(huán)境。
部署地址:https://kubernetes.io/docs/setup/minikube/
kubeadm
Kubeadm也是一個(gè)工具,提供kubeadm init和kubeadm join,用于快速部署Kubernetes集群。
部署地址:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/
二進(jìn)制
從官方下載發(fā)行版的二進(jìn)制包,手動(dòng)部署每個(gè)組件,組成Kubernetes集群。
下載地址:https://github.com/kubernetes/kubernetes/releases
小結(jié): 生產(chǎn)環(huán)境中部署Kubernetes集群,有Kubeadm和二進(jìn)制方式可選,Kubeadm降低部署門(mén)檻,但屏蔽了很多細(xì)節(jié),遇到問(wèn)題很難排查。使用二進(jìn)制包部署Kubernetes集群,雖然手動(dòng)部署麻煩點(diǎn),但能學(xué)習(xí)很多工作原理,更有利于后期維護(hù)。
本文使用kubeadm方式部署,二進(jìn)制部署的方式還是交給專業(yè)的運(yùn)維去完成吧
Kubernetes集群節(jié)點(diǎn)

VMware安裝Centos7略。。。。
Kubernetes-Linux系統(tǒng)初始化
1、配置Linux的IP地址
vim /etc/sysconfig/network-scripts/ifcfg-ens33v
ifcfg-ens33是網(wǎng)卡的最新命名規(guī)范,它會(huì)從BIOS => PCIE通道里獲取它的網(wǎng)卡文件名,如果都沒(méi)有的話,再降級(jí)到eth0或者eth1的命名方式,如果需要關(guān)閉的話,ifnames=0就可以關(guān)閉了。和以前的配置文件修改方式類似。
2、設(shè)置主機(jī)名
hostnamectl set-hostname {hostName}
注意:
- 在大型集群環(huán)境中建議大家通過(guò)DNS的方式,讓主機(jī)名和IP之間能夠相互解析,當(dāng)然也可以通過(guò)修改host文件進(jìn)行配置。
- 小環(huán)境中不建議大家通過(guò)DNS的方式,如果DNS掛掉的話那么集群環(huán)境也就掛掉了。
3、修改host文件【非集群環(huán)境可省略】
vim /etc/hosts
在Linux之間相互拷貝文件
#輸入完此命令后輸入yes,并輸入node01的root密碼即可復(fù)制成功
scp /etc/hosts root@k8s-node01:/etc/hosts
scp /etc/hosts root@k8s-node02:/etc/hosts
4、安裝依賴包
yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git
5、設(shè)置防火墻為lptables 并設(shè)置空規(guī)則
#關(guān)閉firewalld并取消自啟動(dòng)
systemctl stop firewalld && systemctl disable firewalld
#安裝iptables,啟動(dòng)iptables,設(shè)置開(kāi)機(jī)自啟,清空iptables規(guī)則,保存當(dāng)前規(guī)則到默認(rèn)規(guī)則
yum -y install iptables-services && systemctl start iptables && systemctl enable iptables && iptables -F && service iptables save
6、關(guān)閉SELINUX
1、關(guān)閉swap分區(qū)
#關(guān)閉swap分區(qū)【虛擬內(nèi)存】并且永久關(guān)閉虛擬內(nèi)存。
swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
kubeadm初始化Kubernetes時(shí)的過(guò)程中會(huì)檢測(cè)swap分區(qū)到底有沒(méi)有關(guān)閉,因?yàn)槿绻_(kāi)啟虛擬內(nèi)存的話,kubernetes的容器【pod】就有可能會(huì)運(yùn)行在虛擬內(nèi)存上,會(huì)大大的降低容器的工作效率,因此Kubernetes會(huì)要求強(qiáng)制關(guān)閉,可以通過(guò)kubelet的啟動(dòng)參數(shù)--fail-swap-on=false更改這個(gè)限制。推薦關(guān)閉以防止容器運(yùn)行在虛擬內(nèi)存的情況出現(xiàn)。
2、關(guān)閉SELinux
setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
7、相對(duì)于Kubernetes調(diào)整內(nèi)核參數(shù)
cat > kubernetes.conf <<EOF
#開(kāi)啟網(wǎng)橋模式【重要】
net.bridge.bridge-nf-call-iptables=1
#開(kāi)啟網(wǎng)橋模式【重要】
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle=0
#禁止使用swap空間,只有當(dāng)系統(tǒng)OOM時(shí)才允許使用它
vm.swappiness=0
#不檢查物理內(nèi)存是否夠用
vm.overcommit_memory=1
#開(kāi)啟OOM
vm.panic_on_oom=0
fs.inotify.max_user_instances=8192
fs.inotify.max_user_watches=1048576
fs.file-max=52706963
fs.nr_open=52706963
#關(guān)閉ipv6【重要】
net.ipv6.conf.all.disable_ipv6=1
net.netfilter.nf_conntrack_max=2310720
EOF
#將優(yōu)化內(nèi)核文件拷貝到/etc/sysctl.d/文件夾下,這樣優(yōu)化文件開(kāi)機(jī)的時(shí)候能夠被調(diào)用
cp kubernetes.conf /etc/sysctl.d/kubernetes.conf
#手動(dòng)刷新,讓優(yōu)化文件立即生效
sysctl -p /etc/sysctl.d/kubernetes.conf
非Linux4的內(nèi)核下,將會(huì)彈出“sysctl:cannot stat /proc/sys/net/netfilter/nf_conntrack_max:沒(méi)有那個(gè)文件或目錄”,無(wú)視即可。
8、調(diào)整系統(tǒng)時(shí)區(qū)
#設(shè)置系統(tǒng)時(shí)區(qū)為中國(guó)/上海
timedatectl set-timezone Asia/Shanghai
#將當(dāng)前的 UTC 時(shí)間寫(xiě)入硬件時(shí)鐘
timedatectl set-local-rtc 0
#重啟依賴于系統(tǒng)時(shí)間的服務(wù)
systemctl restart rsyslog
systemctl restart crond
9、關(guān)閉系統(tǒng)不需要的服務(wù)
#關(guān)閉及禁用郵件服務(wù)
systemctl stop postfix && systemctl disable postfix
10、設(shè)置日志的保存方式
在Centos7以后,因?yàn)橐龑?dǎo)方式改為了system.d,所以有兩個(gè)日志系統(tǒng)同時(shí)在工作,默認(rèn)的是rsyslogd,以及systemd journald
使用systemd journald更好一些,因此我們更改默認(rèn)為systemd journald,只保留一個(gè)日志的保存方式。
- 1、創(chuàng)建保存日志的目錄
mkdir /var/log/journal
- 2、創(chuàng)建配置文件存放目錄
mkdir /etc/systemd/journald.conf.d
- 3、創(chuàng)建配置文件
cat > /etc/systemd/journald.conf.d/99-prophet.conf <<EOF
[Journal]
#持久化保存到磁盤(pán)
Storage=persistent
#壓縮歷史日志
Compress=yes
SyncIntervalSec=5m
RateLimitInterval=30s
RateLimitBurst=1000
#最大占用空間10G
SystemMaxUse=10G
#單日志文件最大200M
SystemMaxFileSize=200M
#日志保存時(shí)間2周
MaxRetentionSec=2week
#不將日志轉(zhuǎn)發(fā)到syslog
ForwardToSyslog=no
EOF
4、重啟systemd journald的配置
systemctl restart systemd-journald
11、升級(jí)Linux內(nèi)核為4.44版本
CentOS 7.x 系統(tǒng)自帶的3.10.x內(nèi)核存在一些Bugs.導(dǎo)致運(yùn)行的Docker.Kubernetes不穩(wěn)定。
- 1、獲取源
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-4.el7.elrepo.noarch.rpm
- 2、開(kāi)始安裝,安裝完成后檢查 /boot/grub2/grub.cfg中對(duì)應(yīng)內(nèi)核menuentry中是否包含 initrd16 配置,如果沒(méi)有,再安裝一次!
yum --enablerepo=elrepo-kernel install -y kernel-lt
- 3、查看系統(tǒng)中的全部?jī)?nèi)核【可忽略】
rpm -qa | grep kernel
- 4、設(shè)置開(kāi)機(jī)從新內(nèi)核啟動(dòng)
grub2-set-default 'CentoS Linux(4.4.202-1.el7.elrepo.×86_64) 7 (Core)'
12、重啟啟動(dòng)使配置生效
reboot
13、查看正在使用的內(nèi)核【可忽略】
uname -r
Linux內(nèi)核相關(guān)操作操作可查看:https://www.cnblogs.com/fanqisoft/p/11301630.html
14、開(kāi)啟kube-proxy的ipvs的前置條件
模式改為lvs調(diào)度的方式,kube-proxy主要解決的是svc(service)與pod之間的調(diào)度關(guān)系,ipvs的調(diào)度方式可以極大的增加它的訪問(wèn)效率,所以這種方式現(xiàn)在是我們必備的一種。
- 1、加載netfilter模塊
modprobe br_netfilter
- 2、編寫(xiě)一個(gè)引導(dǎo)文件,這個(gè)文件將會(huì)引導(dǎo)我們lvs的一些相關(guān)依賴的加載,注意這里的依賴并不是rpm包含,也是模塊依賴
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
- 3.賦予該文件755權(quán)限并執(zhí)行該文件,然后使用lsmod命令查看這些文件是否被引導(dǎo)。
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
安裝Docker
1、安裝Docker相關(guān)依賴
yum install -y yum-utils device-mapper-persistent-data lvm2
2、設(shè)置阿里云yum源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3、更新yum并安裝Docker-ce
yum update -y && yum install -y docker-ce
4、重啟
reboot
重啟完成后我們之前在Centos設(shè)置默認(rèn)的啟動(dòng)內(nèi)核4.44將被恢復(fù)默認(rèn)到3.10,因此我們需要再次設(shè)置一次并重啟
grub2-set-default 'CentoS Linux(4.4.189-1.el7.elrepo.×86_64) 7 (Core)' && reboot
查看當(dāng)前使用的內(nèi)核
uname -r
5、啟動(dòng)Docker并設(shè)置為開(kāi)機(jī)自啟
systemctl start docker
systemctl enable docker
6、配置daemon文件
cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors":["https://registry.docker-cn.com","https://kxv08zer.mirror.aliyuncs.com"],
"exec-opts":["native.cgroupdriver=systemd"],
"log-driver":"json-file",
"log-opts":{
"max-size":"100m"
}
}
EOF
- exec-opts,設(shè)置默認(rèn)的組為systemd,默認(rèn)情況下Centos有兩個(gè)組,一個(gè)fs,一個(gè)systemd管理的,為了統(tǒng)一化,我們交給systemd管理。
- log-driver,讓我們存儲(chǔ)日志的方式改為json文件的形式
- log-opts,存儲(chǔ)最大為100Mb,這樣我們可以在后期通過(guò)war/log/content/去查找對(duì)應(yīng)的容器的日志信息,這樣就可以在EFK里去搜索對(duì)應(yīng)的信息
- registry-mirrors,設(shè)置Docker鏡像加速
7、創(chuàng)建存儲(chǔ)Docker配置文件的目錄
mkdir -p /etc/systemd/system/docker.service.d
8、重新讀取配置文件并重啟Docker
systemctl daemon-reload && systemctl restart docker && systemctl enable docker
安裝Kubeadm(主從配置)
1、導(dǎo)入阿里云yum倉(cāng)庫(kù)
配置國(guó)內(nèi)kuberneetes的yum源,由于網(wǎng)絡(luò)原因,中國(guó)無(wú)法直接連接到google的網(wǎng)絡(luò),需要配置阿里云的yum源(每臺(tái)master和node都需要操作)
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=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
2、安裝kubeadm初始化工具,命令行管理工具,Docker交互工具
yum -y install kubeadm-1.16.3 kubectl-1.16.3 kubelet-1.16.3
或
[root@master ~]# yum install -y kubelet kubeadm kubectl
[root@node ~]# yum install -y kubelet kubeadm
Kubelet負(fù)責(zé)與其他節(jié)點(diǎn)集群通信,并進(jìn)行本節(jié)點(diǎn)Pod和容器生命周期的管理。Kubeadm是Kubernetes的自動(dòng)化部署工具,降低了部署難度,提高效率。Kubectl是Kubernetes集群管理工具
溫馨提示:如果yum安裝提示找不到鏡像之類的,請(qǐng)yum makecache更新下yum源
3、設(shè)置kubelet開(kāi)機(jī)自啟
systemctl enable kubelet.service
或
systemctl enable kubelet
systemctl start kubelet
因?yàn)閗ubelet需要跟我們的容器接口進(jìn)行交互,啟動(dòng)我們的容器,而我們的k8s通過(guò)kubeadm安裝出來(lái)以后都是以pod的方式存在,也就是底層是以容器的方式運(yùn)行,所以kubelet一定要是開(kāi)機(jī)自啟的,不然的話,重啟以后k8s集群不會(huì)啟動(dòng)。
4、初始化k8s主節(jié)點(diǎn)
拉取Kubernetes鏡像四種方式
1、導(dǎo)入離線的鏡像。
kubeadm在初始化k8s集群的時(shí)候,會(huì)從GCE【谷歌云服務(wù)器】里去拉取鏡像,并且這些鏡像是相當(dāng)大的,而且速度比較慢,最重要的是,一般都會(huì)404,因此我們直接導(dǎo)入離線的鏡像。2、從dockerhub上下載相關(guān)鏡像,然后修改成Kubernetes初始化需要的Tag即可
docker pull kubeimage/kube-apiserver-amd64:v1.16.2
docker pull kubeimage/kube-proxy-amd64:v1.16.2
docker pull kubeimage/kube-controller-manager-amd64:v1.16.2
docker pull kubeimage/kube-scheduler-amd64:v1.16.2
docker pull coredns/coredns:1.6.2
docker pull kubeimage/etcd-amd64:3.3.15-0
docker pull kubeimage/pause-amd64:3.1
將上面拉取的鏡像修改成下面的tag
k8s.gcr.io/kube-apiserver:v1.16.2
k8s.gcr.io/kube-proxy:v1.16.2
k8s.gcr.io/kube-controller-manager:v1.16.2
k8s.gcr.io/kube-scheduler:v1.16.2
k8s.gcr.io/coredns:1.6.2
k8s.gcr.io/etcd:3.3.15-0
k8s.gcr.io/pause:3.1
- 3、指定鏡像源從阿里云鏡像倉(cāng)庫(kù)拉取
注意這里執(zhí)行初始化用到了- -image-repository選項(xiàng),指定初始化需要的鏡像源從阿里云鏡像倉(cāng)庫(kù)拉取。配置如下:
kubeadm init \
--apiserver-advertise-address=192.168.92.56 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.13.1 \
--pod-network-cidr=10.244.0.0/16
完整的從阿里云拉取Kubernetes鏡像:https://www.cnblogs.com/tylerzhou/p/10971336.html
- 4、采用科學(xué)上網(wǎng)的方式,就不用這么麻煩了
開(kāi)始初始化【這些命令應(yīng)運(yùn)行在主節(jié)點(diǎn)上】
通過(guò)如下指令創(chuàng)建默認(rèn)的kubeadm-config.yaml文件:
kubeadm config print init-defaults > kubeadm-config.yaml
kubeadm-config.yaml組成部署說(shuō)明:
- InitConfiguration: 用于定義一些初始化配置,如初始化使用的token以及apiserver地址等
- ClusterConfiguration:用于定義apiserver、etcd、network、scheduler、controller-manager等master組件相關(guān)配置項(xiàng)
- KubeletConfiguration:用于定義kubelet組件相關(guān)的配置項(xiàng)
- KubeProxyConfiguration:用于定義kube-proxy組件相關(guān)的配置項(xiàng)
查看并修改kubeadm-config.yaml文件
vim kubeadm-config.yaml
#修改的內(nèi)容
localAPIEndpoint:
advertiseAddress: 192.168.66.77 //當(dāng)前服務(wù)器的節(jié)點(diǎn)地址(當(dāng)前ip地址)
kubernetesVersion: v1.16.3 //模板的版本可能與我們實(shí)際安裝的版本不同,需要修改
networking:
podSubnet: 10.244.0.0/16 //(+)聲明pod的所處網(wǎng)段【注意,必須要添加此內(nèi)容】默認(rèn)情況下我們會(huì)安裝一個(gè)Flannel網(wǎng)絡(luò)插件去實(shí)現(xiàn)覆蓋性網(wǎng)路,它的默認(rèn)pod網(wǎng)段就這么一個(gè)網(wǎng)段,如果這個(gè)網(wǎng)段不一致的話,后期我們需要進(jìn)入pod一個(gè)個(gè)修改
serviceSubnet: 10.96.0.0/12
#添加的內(nèi)容【請(qǐng)注意,在Kubernetes 1.11和更高版本中,默認(rèn)SupportIPVSProxyMode設(shè)置為true,因此高版本中此部分可省略。github文檔:https://github.com/kubernetes/kubernetes/blob/master/pkg/proxy/ipvs/README.md】
apiVersion: kubeproxy.config.k8s.io/v1alpha1 //把默認(rèn)的調(diào)度方式改為ipvs調(diào)度模式
kind: KubeProxyConfiguration
kubeProxy:
config:
featureGates:
SupportIPVSProxyMode: true
mode: ipvs
開(kāi)始進(jìn)行初始化
使用指定的yaml文件進(jìn)行初始化安裝 自動(dòng)頒發(fā)證書(shū)(1.13后支持) 把所有的信息都寫(xiě)入到 kubeadm-init.log中
kubeadm init --config=kubeadm-config.yaml --upload-certs | tee kubeadm-init.log
通過(guò)初始化日志查看初始化過(guò)程中的信息
vim kubeadm-init.log
日志信息一般有以下幾點(diǎn):
1.最開(kāi)始告訴我們kubernetes的版本
2.檢測(cè)當(dāng)前運(yùn)行環(huán)境
3.為k8s集群下載鏡像【時(shí)間很長(zhǎng),鏡像需要從Google GCE下載】
4.開(kāi)始安裝鏡像
5.在/var/lib/kubelet/kubeadm-flags.env文件中保存了kubelet環(huán)境變量
6.在/var/lib/kubelet/config.yaml文件中保存了kubelet配置文件
7.在/etc/kubernetes/pki目錄中保存了k8s所使用的所有的證書(shū),因?yàn)閗8s采用了http協(xié)議進(jìn)行的C/S結(jié)構(gòu)的開(kāi)發(fā),它為了安全性考慮在所有的組件通訊的時(shí)候采用的是https的雙向認(rèn)證的方案,所以k8s需要大量的CE證書(shū)以及私鑰密鑰
8.配置DNS以及當(dāng)前默認(rèn)的域名【svc(service)的默認(rèn)名稱】
9.生成k8s組件的密鑰
10。指定DNS的名稱及地址
11.在/etc/kubernetes目錄下生成k8s組件的配置文件
12.RBAC授權(quán)
13.初始化成功
初始化完成后需要的工作
在當(dāng)前的用戶的Home目錄下創(chuàng)建.kube目錄(這個(gè)目錄中保存我們的連接配置,kubectl和kubeApi進(jìn)行https通訊,所以有一些緩存需要保存以及一些認(rèn)證文件)
mkdir -p $HOME/.kube
拷貝集群管理員的配置文件到這個(gè)目錄下
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
授予權(quán)限(所有者 所有組授予當(dāng)前的用戶)
sudo chown $(id -u):$(id -g) $HOME/.kube/config
查看k8s節(jié)點(diǎn)狀態(tài)
kubectl get node
此時(shí)主節(jié)點(diǎn)狀態(tài)為NotReady,因?yàn)閗8s需要扁平化的網(wǎng)絡(luò),此時(shí)k8s中還沒(méi)有構(gòu)建flannel網(wǎng)絡(luò)插件
安裝flannel網(wǎng)絡(luò)插件,下載flannel yaml文件
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
安裝好后,創(chuàng)建flannel
kubectl create -f kube-flannel.yml
查看flannel是否部署成功【系統(tǒng)組件默認(rèn)在kube-system命名空間下】,同樣使用ifconfig也可以看到flannel
kubectl get pod -n kube-system
此時(shí)查看node狀態(tài)應(yīng)該為Ready狀態(tài)
將k8s子節(jié)點(diǎn)加入到k8s主節(jié)點(diǎn)【命令在vim kubeadm-init.log中】,該命令在子節(jié)點(diǎn)運(yùn)行
kubeadm join masterIp:masterPort --token xxx
此時(shí)查看node節(jié)點(diǎn)應(yīng)該有3個(gè),但子節(jié)點(diǎn)狀態(tài)為notReady,等待子節(jié)點(diǎn)的flannel初始化完成即可。
如果子節(jié)點(diǎn)執(zhí)行加入主節(jié)點(diǎn)的命令報(bào)錯(cuò)的話,可以嘗試執(zhí)行kubeadm reset命令后重試
至此,Kubernetes集群部署成功
參考:
https://www.cnblogs.com/fanqisoft/p/11498049.html
https://www.cnblogs.com/fanqisoft/p/11498217.html
https://www.cnblogs.com/liangyuntao-ts/p/11055856.html