Kubernetes集群安裝

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)

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

https://www.cnblogs.com/tylerzhou/p/10971336.html

https://my.oschina.net/Kanonpy/blog/3006129

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容