一、簡(jiǎn)介
1.簡(jiǎn)介
kubernetes,簡(jiǎn)稱K8s,是用8代替8個(gè)字符“ubernete”而成的縮寫。是一個(gè)開源的,用于管理云平臺(tái)中多個(gè)主機(jī)上的容器化的應(yīng)用,Kubernetes的目標(biāo)是讓部署容器化的應(yīng)用簡(jiǎn)單并且高效(powerful),Kubernetes提供了應(yīng)用部署,規(guī)劃,更新,維護(hù)的一種機(jī)制。
Kubernetes是Google開源的一個(gè)容器編排引擎,它支持自動(dòng)化部署、大規(guī)??缮炜s、應(yīng)用容器化管理。在生產(chǎn)環(huán)境中部署一個(gè)應(yīng)用程序時(shí),通常要部署該應(yīng)用的多個(gè)實(shí)例以便對(duì)應(yīng)用請(qǐng)求進(jìn)行負(fù)載均衡。
在Kubernetes中,我們可以創(chuàng)建多個(gè)容器,每個(gè)容器里面運(yùn)行一個(gè)應(yīng)用實(shí)例,然后通過內(nèi)置的負(fù)載均衡策略,實(shí)現(xiàn)對(duì)這一組應(yīng)用實(shí)例的管理、發(fā)現(xiàn)、訪問,而這些細(xì)節(jié)都不需要運(yùn)維人員去進(jìn)行復(fù)雜的手工配置和處理。
2.架構(gòu)
1)Kubernetes集群的組成

1.1 Master節(jié)點(diǎn)的核心組件
Master節(jié)點(diǎn)是Kubernetes集群的管理和控制節(jié)點(diǎn)。Master節(jié)點(diǎn)由如下4個(gè)進(jìn)程組成:

apiserver:提供Restful API,是整個(gè)集群管理和控制的入口。apiserver封裝了資源對(duì)象的CRUD操作并持久化到etcd中,REST API提供給外部客戶端和內(nèi)部組件調(diào)用。
scheduler:是調(diào)度器,主要負(fù)責(zé)Pod調(diào)度,每個(gè)Pod最終被調(diào)度到哪臺(tái)服務(wù)器上是由Scheduler決定的
controller-manager:是比較關(guān)鍵的組件,是Kubernetes集群中所有資源的自動(dòng)化控制中心
etcd: etcd是一個(gè)分布式的鍵值存儲(chǔ),它實(shí)際上保存整個(gè)Kubernetes集群各種資源和狀態(tài),可以它理解成Kubernetes集群的數(shù)據(jù)庫。
scheduler和controller-manager都是通過apiserver從etcd中獲取各種資源的狀態(tài),進(jìn)行相應(yīng)的調(diào)度和控制操作。
? 1.2? ?Node節(jié)點(diǎn)的組件

Node節(jié)點(diǎn)是Kubernetes集群的工作負(fù)載節(jié)點(diǎn),我們的服務(wù)實(shí)例是跑在多個(gè)Node節(jié)點(diǎn)上。Node節(jié)點(diǎn)上主要有如下組件:
kubelet:主要負(fù)責(zé)本節(jié)點(diǎn)Pod的生命周期管理,定期向Master上報(bào)本節(jié)點(diǎn)及Pod的基本信息。kubelet會(huì)從apiserver接收Pod的創(chuàng)建請(qǐng)求,啟動(dòng)和停止Pod。
kube-proxy: 實(shí)現(xiàn)Kubernetes上Service的通信及負(fù)載均衡。kuer-proxy目前有userspace和iptables兩種實(shí)現(xiàn)方式。userspace是在用戶空間,通過kuber-proxy實(shí)現(xiàn)負(fù)載均衡的代理服務(wù)。這個(gè)是kube-proxy的最初的版本,較為穩(wěn)定,但是效率不太高。另外一種方式是iptables的方式,在內(nèi)核空間,是純采用iptables來實(shí)現(xiàn)LB,是Kubernetes目前默認(rèn)的方式。
2) Kubernetes HA部署方案

部署了3個(gè)Master節(jié)點(diǎn),每個(gè)Master節(jié)點(diǎn)的etcd組成集群
3個(gè)Master節(jié)點(diǎn)上的APIServer的前面放一個(gè)負(fù)載均衡器,工作節(jié)點(diǎn)和客戶端通過這個(gè)負(fù)載均衡器和APIServer進(jìn)行通信
scheduler和controller-manager支持leader選舉,能保證在集群中多個(gè)實(shí)例只有一個(gè)工作,其他為備用
二、準(zhǔn)備虛擬機(jī)軟件和Linux OS
1.虛擬機(jī)軟件安裝(VirtualBox6.10)
http://www.itdecent.cn/p/7c1b9c24499d 2
2。Linux OS安裝(Ubuntu20.04)?
http://www.itdecent.cn/p/9f08d6e7c4ab
3。設(shè)置虛擬機(jī)的處理器數(shù)量至少為2
? ? ? ? master節(jié)點(diǎn)處理器數(shù)量至少為2
? ? ? ? node節(jié)點(diǎn)處理器數(shù)量可以為1
? ? ? ? 本實(shí)驗(yàn)只需要一個(gè)master節(jié)點(diǎn)和一個(gè)node節(jié)點(diǎn)

4.配置windows與ubuntu間的共享目錄
? ? 在Ubuntu20.04中創(chuàng)建share目錄? ??
????人工掛接
????????sudo mount -t vboxsf -o rw,uid=1000,gid=1000 share ~/share
????啟動(dòng)時(shí)自動(dòng)掛接
????????????sudo vi /etc/fstab
????????????在底下加一句
????????????share /home/zhangwb/share vboxsf rw,gid=1000,uid=1000,auto 0 0
? ? ? ? ? ? 注意目錄/home/zhangwb/share要換成實(shí)際的路徑
4.配置國(guó)內(nèi)源
????備份sources.list文件
????$ cd /etc/apt
????$ sudo mv sources.list sources.list.bak
????$ sudo vi /etc/apt/sources.list??
????//插入國(guó)內(nèi)源(將附錄的國(guó)內(nèi)yum源放入到文件中)
????$ sudo apt-getupdate
4.安裝sshd
安裝openssh-server
????????$?sudo apt-get install openssh-server
生成key
????????????運(yùn)行ssh-keygen生成公鑰文件和私鑰文件 id_rsa,id_rsa.pub或id_dsa,id_dsa.pub
????????? ??????????ssh-keygen -t rsa
配置authorized_keys
? ???????????????????cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
? ??????????????????cat ~/.ssh/authorized_keys
執(zhí)行ssh
? ? ? ? ? ? ? ? ssh localhost
三、安裝前配置?
本實(shí)驗(yàn)先安裝好一臺(tái)master機(jī)器,等所有軟件都安裝好之后,從master復(fù)制出來一個(gè)虛擬機(jī)作為node節(jié)點(diǎn)
1.規(guī)劃主機(jī)名
????規(guī)劃主機(jī)名稱
????k8s-master
????k8s-node1
????k8s-node2
2.設(shè)置主機(jī)名
????$ sudo hostnamectl set-hostname "k8s-master"???? // Run this command on masternode
????$ cat /etc/hostname
????k8s-master
????$ sudo hostnamectl set-hostname "k8s-node1"???? // Run this command on node-0
????$ sudo hostnamectl set-hostname "k8s-node2"???? // Run this command on node-1
3.配置?/etc/hosts?
查看ip地址
$ ifconfig
//要是提示沒有安裝包時(shí)
$ sudo apt install net-tools
配置/etc/hosts
$ sudo vi /etc/hosts
10.1.13.106??? k8s-master
#10.1.13.107??? k8s-node1
#10.1.13.108??? k8s-node1
將IP替換為實(shí)際的ip地址
4.禁用swap
$ sudo swapoff –a
$ sudo vi /etc/fstab
把/etc/fstab包含swap那行記錄#掉。
5.關(guān)閉防火墻
$ sudo systemctl stop firewalld
$ sudo systemctl disable firewalld
6.禁用Selinux
$ sudo apt install selinux-utils
$ setenforce 0
7.確保時(shí)區(qū)和時(shí)間正確
$ sudo timedatectl set-timezone Asia/Shanghai
$ sudo systemctl restart rsyslog
$ sudo apt-get install ntpdate –y
$ sudo ntpdate time.windows.com
8.配置net.bridge.bridge-nf-call-iptables
$ cat <
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
$ sudo sysctl --system
9.設(shè)置rp_filter的值
$ sudo vi /etc/sysctl.d/10-network-security.conf
#將下面兩個(gè)參數(shù)的值從2修改為1
net.ipv4.conf.default.rp_filter=1
net.ipv4.conf.all.rp_filter=1
$ sudo sysctl --system
10.enable IP forwarding on all nodes
$ sudo vi /etc/sysctl.conf
// 找到net.ipv4.ip_forward=1” and un-comment it
$ sudo sysctl -p
net.ipv4.ip_forward = 1
四、安裝docker
1.查看當(dāng)前安裝的docker版本
$ docker version
2.卸載當(dāng)前安裝的docker版本(可選)?
$?sudo apt-get remove docker.io
3.查看可安裝的docker版本(可選)?
安裝以下包以使apt可以通過HTTPS使用存儲(chǔ)庫(repository):
$ sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
添加Docker官方的GPG密鑰:
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg| sudo apt-key add –
再更新一下apt包索引:
$ sudo apt-get update
列出可用的版本:
$?apt-cache madison docker.io
4.安裝docker
安裝最新版
$ sudo apt install -y docker.io
安裝特定版
sudo apt-get install docker.io=xxx
xxx為apt-cache madison docker.io輸出中第二列完整的信息,如
sudo apt-get install docker.io=19.03.8-0ubuntu1.20.04.1
5.啟動(dòng)docker
啟動(dòng)docker
$ sudo systemctl start docker
設(shè)置開機(jī)自啟動(dòng)
$ sudo systemctl enable docker
或
$ sudo systemctl enable docker.service --now
6.驗(yàn)證docker
$ systemctl status docker
$ docker --version
7.重啟docker(當(dāng)有配置改動(dòng)后執(zhí)行)
$ sudo pkill -SIGHUP dockerd
//或者
$ sudo systemctl restart docker
8.配置docker鏡像加速器
獲取加速器地址
訪問www.aliyun.com,支付寶登錄,然后到https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors獲取地址和安裝方法
配置鏡像加速器
通過修改daemon配置文件/etc/docker/daemon.json來使用加速器
$ sudo mkdir -p /etc/docker
$ sudo tee /etc/docker/daemon.json <<-'EOF'
{
? "registry-mirrors": ["https://yyy.mirror.aliyuncs.com"]
}
EOF
yyy為上一步中阿里云展示的加速域名前綴
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
五、安裝K8s軟件
1.安裝最新版本
$ sudo apt-get update && sudo apt-get install -y ca-certificates curl software-properties-common apt-transport-https curl
$ curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -
$ sudo tee /etc/apt/sources.list.d/kubernetes.list <
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
$ sudo apt-get update
//安裝最新版本
$ sudo apt-get install -y kubelet kubeadm kubectl
2.刪除已安裝版本
kubeadm version
sudo apt-get remove -y --allow-change-held-packages kubeadm?kubectl?kubelet?kubernetes-cn
3.查詢k8s可安裝的版本:
apt-cache madison kubeadm
apt-cache madison kubelet
apt-cache madison kubectl
apt-cache madison kubernetes-cni
4.安裝指定的k8s版本
sudo apt-get install -y?kubelet=1.17.3-00?kubectl=1.17.3-00?kubernetes-cni=0.8.7-00?kubeadm=1.17.3-00
5.設(shè)置不隨系統(tǒng)更新而更新
$ sudo apt-mark hold kubelet kubeadm kubectl
六、克隆nodes節(jié)點(diǎn)
1.?關(guān)閉虛擬機(jī)
$ sudo shutdown now
2. 復(fù)制虛擬機(jī)
回到Oracle VM VirtualBox主界面,選擇k8s-master,右擊鼠標(biāo),點(diǎn)擊復(fù)制...

名稱:k8s-node1
路徑:選擇合適的路徑
MAC地址:為所有網(wǎng)卡重新生成MAC地址

下一步,選擇完全復(fù)制

3. 重啟虛擬機(jī)
? ? k8s-master
? ??k8s-node
4. 重新設(shè)置node主機(jī)名
????$ sudo hostnamectl set-hostname "k8s-node1"???? // Run this command on node-1
???$ cat /etc/hostname
3.配置?/etc/hosts?
查看ip地址
$ ifconfig
4.配置/etc/hosts
$ sudo vi /etc/hosts
10.1.13.106??? k8s-master
10.1.13.107??? k8s-node1
七、初始化master(k8s-master節(jié)點(diǎn)上執(zhí)行)
$ sudo kubeadm init --kubernetes-version=v1.17.3 --pod-network-cidr 10.244.0.0/16 --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers
注:
? ??????--kubernetes-version=v1.17.3 當(dāng)安裝的是最新版本時(shí),這個(gè)參數(shù)可以省略
? ??????--pod-network-cidr 10.244.0.0/16? ? 需要跟當(dāng)前虛擬機(jī)的ip地址處于不同網(wǎng)段(ifconfig參考),并且與下面的網(wǎng)絡(luò)插件參數(shù)設(shè)置要一致(calico.yaml中的CALICO_IPV4POOL_CIDR(原始值192.168.0.0/16))
? ? ? ? 執(zhí)行成功后,會(huì)出現(xiàn)如下提示

?執(zhí)行?
? mkdir -p $HOME/.kube
? sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
? sudo chown $(id -u):$(id -g) $HOME/.kube/config
? ?kubectl get node

八、將node節(jié)點(diǎn)加入
在所有node節(jié)點(diǎn)上執(zhí)行
sudo kubeadm join 192.168.3.164:6443 --token qqfpor.kxmumjmjnssqtg0o --discovery-token-ca-cert-hash sha256:20a02a32f27c13b4dddec7b4435370805c5bfd44186fbd25c9175a714e1e380e
其中:
192.168.3.164:6443 為master節(jié)點(diǎn)ip地址和端口
--token qqfpor.kxmumjmjnssqtg0o
? ? 這個(gè)參數(shù)可以通過在master上執(zhí)行:kubeadm token list獲得

--discovery-token-ca-cert-hash sha256:20a02a32f27c13b4dddec7b4435370805c5bfd44186fbd25c9175a714e1e380e
? ? 這個(gè)參數(shù)可以通過在master上執(zhí)行:openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'? ? ? ? ? ?獲得

? ?kubectl get node

等裝好網(wǎng)絡(luò)插件就會(huì)Ready了
九、安裝網(wǎng)絡(luò)插件(calico)
#下載
https://docs.projectcalico.org/v3.11/manifests/calico.yaml
vi calico.yaml
#修改CALICO_IPV4POOL_CIDR,為10.244.0.0/16(要與kubeadm inti中的--pod-network-cidr 10.244.0.0/16參數(shù)保持一致,默認(rèn)為192.168.0.0/16)

然后
$ kubectl apply -f calico.yaml
kubectl get node

需要等待一會(huì),中間可以通過執(zhí)行以下命令來查看pod是否全部ready
kubectl get pod -n kube-system

十、驗(yàn)證
1.創(chuàng)建nginxdeployment
$ kubectl create deployment nginx-web --image=nginx

2.獲取pod列表
$ kubectl get pod -o wide

3.測(cè)試nginx
curl http://10.244.36.65
