網(wǎng)站建設(shè)成本價(jià)瀏覽器看b站
二 Kubernetes介紹
1.1 應(yīng)用部署方式演變
在部署應(yīng)用程序的方式上,主要經(jīng)歷了三個(gè)時(shí)代:
-
傳統(tǒng)部署:互聯(lián)網(wǎng)早期,會(huì)直接將應(yīng)用程序部署在物理機(jī)上
優(yōu)點(diǎn):簡(jiǎn)單,不需要其它技術(shù)的參與
缺點(diǎn):不能為應(yīng)用程序定義資源使用邊界,很難合理地分配計(jì)算資源,而且程序之間容易產(chǎn)生影響
-
虛擬化部署:可以在一臺(tái)物理機(jī)上運(yùn)行多個(gè)虛擬機(jī),每個(gè)虛擬機(jī)都是獨(dú)立的一個(gè)環(huán)境
優(yōu)點(diǎn):程序環(huán)境不會(huì)相互產(chǎn)生影響,提供了一定程度的安全性
缺點(diǎn):增加了操作系統(tǒng),浪費(fèi)了部分資源
-
容器化部署:與虛擬化類似,但是共享了操作系統(tǒng)
優(yōu)點(diǎn):
可以保證每個(gè)容器擁有自己的文件系統(tǒng)、CPU、內(nèi)存、進(jìn)程空間等
運(yùn)行應(yīng)用程序所需要的資源都被容器包裝,并和底層基礎(chǔ)架構(gòu)解耦
容器化的應(yīng)用程序可以跨云服務(wù)商、跨Linux操作系統(tǒng)發(fā)行版進(jìn)行部署
容器化部署方式給帶來很多的便利,但是也會(huì)出現(xiàn)一些問題,比如說:
- 一個(gè)容器故障停機(jī)了,怎么樣讓另外一個(gè)容器立刻啟動(dòng)去替補(bǔ)停機(jī)的容器
- 當(dāng)并發(fā)訪問量變大的時(shí)候,怎么樣做到橫向擴(kuò)展容器數(shù)量
這些容器管理的問題統(tǒng)稱為容器編排問題,為了解決這些容器編排問題,就產(chǎn)生了一些容器編排的軟件:
- Swarm:Docker自己的容器編排工具
- Mesos:Apache的一個(gè)資源統(tǒng)一管控的工具,需要和Marathon結(jié)合使用
- Kubernetes:Google開源的的容器編排工具
1.2 kubernetes簡(jiǎn)介
kubernetes,是一個(gè)全新的基于容器技術(shù)的分布式架構(gòu)領(lǐng)先方案,是谷歌嚴(yán)格保密十幾年的秘密武器----Borg系統(tǒng)的一個(gè)開源版本,于2014年9月發(fā)布第一個(gè)版本,2015年7月發(fā)布第一個(gè)正式版本。
kubernetes官網(wǎng)
kubernetes的本質(zhì)是一組服務(wù)器集群,它可以在集群的每個(gè)節(jié)點(diǎn)上運(yùn)行特定的程序,來對(duì)節(jié)點(diǎn)中的容器進(jìn)行管理。目的是實(shí)現(xiàn)資源管理的自動(dòng)化,主要提供了如下的主要功能:
- 自我修復(fù):一旦某一個(gè)容器崩潰,能夠在1秒中左右迅速啟動(dòng)新的容器
- 彈性伸縮:可以根據(jù)需要,自動(dòng)對(duì)集群中正在運(yùn)行的容器數(shù)量進(jìn)行調(diào)整
- 服務(wù)發(fā)現(xiàn):服務(wù)可以通過自動(dòng)發(fā)現(xiàn)的形式找到它所依賴的服務(wù)
- 負(fù)載均衡:如果一個(gè)服務(wù)起動(dòng)了多個(gè)容器,能夠自動(dòng)實(shí)現(xiàn)請(qǐng)求的負(fù)載均衡
- 版本回退:如果發(fā)現(xiàn)新發(fā)布的程序版本有問題,可以立即回退到原來的版本
- 存儲(chǔ)編排:可以根據(jù)容器自身的需求自動(dòng)創(chuàng)建存儲(chǔ)卷
1.3 kubernetes組件
一個(gè)kubernetes集群主要是由控制節(jié)點(diǎn)(master,做管理)、工作節(jié)點(diǎn)(node) 構(gòu)成,每個(gè)節(jié)點(diǎn)上都會(huì)安裝不同的組件。
master:集群的控制平面,負(fù)責(zé)集群的決策 ( 集群管理者 )
ApiServer : 資源操作的唯一入口,接收用戶輸入的命令,提供認(rèn)證、授權(quán)、API注冊(cè)和發(fā)現(xiàn)等機(jī)制
Scheduler : 負(fù)責(zé)集群資源調(diào)度(計(jì)算),按照預(yù)定的調(diào)度策略將Pod調(diào)度到相應(yīng)的node節(jié)點(diǎn)上
ControllerManager : 負(fù)責(zé)維護(hù)集群的狀態(tài),比如程序部署安排、故障檢測(cè)、自動(dòng)擴(kuò)展、滾動(dòng)更新等
Etcd :負(fù)責(zé)存儲(chǔ)集群中各種資源對(duì)象的信息(默認(rèn)使用etcd,也可以手動(dòng)改為mysql等)
node:集群的數(shù)據(jù)平面,負(fù)責(zé)為容器提供運(yùn)行環(huán)境 (真正干活 )
Kubelet : 負(fù)責(zé)維護(hù)容器的生命周期,即通過控制docker,來創(chuàng)建、更新、銷毀容器
KubeProxy : 負(fù)責(zé)提供集群內(nèi)部的服務(wù)發(fā)現(xiàn)和負(fù)載均衡(訪問k8s里程序的入口,例如他可以提供訪問linux的入口)
Docker : 負(fù)責(zé)節(jié)點(diǎn)上容器的各種操作
下面,以部署一個(gè)nginx服務(wù)來說明kubernetes系統(tǒng)各個(gè)組件調(diào)用關(guān)系:
-
首先要明確,一旦kubernetes環(huán)境啟動(dòng)之后,master和node都會(huì)將自身的信息存儲(chǔ)到etcd數(shù)據(jù)庫中
-
一個(gè)nginx服務(wù)的安裝請(qǐng)求會(huì)首先被發(fā)送到master節(jié)點(diǎn)的apiServer組件
-
apiServer組件會(huì)調(diào)用scheduler組件來決定到底應(yīng)該把這個(gè)服務(wù)安裝到哪個(gè)node節(jié)點(diǎn)上
在此時(shí),它會(huì)從etcd中讀取各個(gè)node節(jié)點(diǎn)的信息,然后按照一定的算法進(jìn)行選擇,并將結(jié)果告知apiServer
-
apiServer調(diào)用controller-manager去調(diào)度Node節(jié)點(diǎn)安裝nginx服務(wù)
-
kubelet接收到指令后,會(huì)通知docker,然后由docker來啟動(dòng)一個(gè)nginx的pod
pod是kubernetes的最小操作單元,容器必須跑在pod中
-
至此,一個(gè)nginx服務(wù)就運(yùn)行了,如果需要訪問nginx,就需要通過kube-proxy來對(duì)pod產(chǎn)生訪問的代理
這樣,外界用戶就可以訪問集群中的nginx服務(wù)了
1.4 kubernetes概念
Master:集群控制節(jié)點(diǎn),每個(gè)集群需要至少一個(gè)master節(jié)點(diǎn)負(fù)責(zé)集群的管控
Node:工作負(fù)載節(jié)點(diǎn),由master分配容器到這些node工作節(jié)點(diǎn)上,然后node節(jié)點(diǎn)上的docker負(fù)責(zé)容器的運(yùn)行
Pod:kubernetes的最小控制單元,容器都是運(yùn)行在pod中的,一個(gè)pod中可以有1個(gè)或者多個(gè)容器
Controller:控制器,通過它來實(shí)現(xiàn)對(duì)pod的管理,比如啟動(dòng)pod、停止pod、伸縮pod的數(shù)量等等
Service:pod對(duì)外服務(wù)的統(tǒng)一入口,下面可以維護(hù)者同一類的多個(gè)pod
Label:標(biāo)簽,用于對(duì)pod進(jìn)行分類,同一類pod會(huì)擁有相同的標(biāo)簽
NameSpace:命名空間,用來隔離pod的運(yùn)行環(huán)境(默認(rèn)pod之間是可以相互訪問的,有了Namspace后,可以控制pod之間是否能訪問)
二 kubernetes集群環(huán)境搭建
2.1 集群類型
Kubernetes集群大致分為兩類:一主多從和多主多從。
● 一主多從:一個(gè)Master節(jié)點(diǎn)和多臺(tái)Node節(jié)點(diǎn),搭建簡(jiǎn)單,但是有單機(jī)故障風(fēng)險(xiǎn),適合用于測(cè)試環(huán)境。
● 多主多從:多臺(tái)Master和多臺(tái)Node節(jié)點(diǎn),搭建麻煩,安全性高,適合用于生產(chǎn)環(huán)境。
為了測(cè)試方便,本次搭建的是一主多從類型的集群。
2.1.1 安裝方式
kubernetes有多種部署方式,目前主流的方式有kubeadm、minikube、二進(jìn)制包。
● minikube:一個(gè)用于快速搭建單節(jié)點(diǎn)的kubernetes工具。
● kubeadm:一個(gè)用于快速搭建kubernetes集群的工具。
● 二進(jìn)制包:從官網(wǎng)上下載每個(gè)組件的二進(jìn)制包,依次去安裝,此方式對(duì)于理解kubernetes組件更加有效。
我們需要安裝kubernetes的集群環(huán)境,但是又不想過于麻煩,所以選擇kubeadm方式
2.1.2 主機(jī)規(guī)劃
角色 | IP地址 | 操作系統(tǒng) | 配置 |
---|---|---|---|
Master | 192.168.18.100 | CentOS7.5,基礎(chǔ)設(shè)施服務(wù)器 | 2核CPU,2G內(nèi)存,50G硬盤 |
Node1 | 192.168.18.101 | CentOS7.5,基礎(chǔ)設(shè)施服務(wù)器 | 2核CPU,2G內(nèi)存,50G硬盤 |
Node2 | 192.168.18.102 | CentOS7.5,基礎(chǔ)設(shè)施服務(wù)器 | 2核CPU,2G內(nèi)存,50G硬盤 |
2.2 環(huán)境搭建
2.2.1 前言
本次環(huán)境搭建需要三臺(tái)CentOS服務(wù)器(一主二從),然后在每臺(tái)服務(wù)器中分別安裝Docker(18.06.3)、kubeadm(1.18.0)、kubectl(1.18.0)和kubelet(1.18.0)。
沒有特殊說明,就是三臺(tái)機(jī)器都需要執(zhí)行。
配置虛擬機(jī)IP與主機(jī)名
配置ip
這里改為手動(dòng)設(shè)置ip
具體的ip網(wǎng)斷是多少?需要查一下這里:
選擇net模式,左下角就是你自己虛擬機(jī)的網(wǎng)斷(注意,vmware默認(rèn).2是網(wǎng)關(guān),所以ip不可以配成192.1681.109.2)
所以回到ip配置這里繼續(xù)
DNS地址使用阿里的地址即可
2.2.2 環(huán)境初始化
2.2.2.1 檢查操作系統(tǒng)的版本
檢查操作系統(tǒng)的版本(要求操作系統(tǒng)的版本至少在7.5以上)
cat /etc/redhat-release
2.2.2.2 關(guān)閉防火墻和禁止防火墻開機(jī)啟動(dòng)
生產(chǎn)環(huán)境不能這么干,只打開使用的端口即可
關(guān)閉防火墻:
systemctl stop firewalld
禁止防火墻開機(jī)啟動(dòng):
systemctl disable firewalld
2.2.2.3 設(shè)置主機(jī)名
設(shè)置主機(jī)名語法
hostnamectl set-hostname <hostname>
設(shè)置192.168.18.100的主機(jī)名:
hostnamectl set-hostname master
設(shè)置192.168.18.101的主機(jī)名
hostnamectl set-hostname node1
設(shè)置192.168.18.102的主機(jī)名
hostnamectl set-hostname node2
2.2.2.4 主機(jī)名解析
為了方便后面集群節(jié)點(diǎn)間的直接調(diào)用,需要配置一下主機(jī)名解析,企業(yè)中推薦使用內(nèi)部的DNS服務(wù)器里配置。
#vim /etc/hosts
192.168.18.100 master
192.168.18.101 node1
192.168.18.102 node2
檢測(cè)配置是否成功:機(jī)器間直接ping主機(jī)名
2.2.2.5 時(shí)間同步
kubernetes要求集群中的節(jié)點(diǎn)時(shí)間必須精確一致,所以在每個(gè)節(jié)點(diǎn)上添加時(shí)間同步(企業(yè)里建議配置自己的時(shí)間同步服務(wù)器):
直接執(zhí)行這倆命令:
systemctl start chronyd
systemctl enable chronyd
或者執(zhí)行下邊這倆命令也行:
yum install ntpdate -y
ntpdate time.windows.com
2.2.2.6 關(guān)閉selinux
selinux是linux下的安全服務(wù),如果不關(guān)閉,在安裝集群中會(huì)產(chǎn)生各種問題
查看selinux是否開啟
getenforce
永久關(guān)閉selinux,需要重啟
#方式一
sed -i 's/enforcing/disabled/' /etc/selinux/config
#方式二:編輯/etc/selinux/config文件,修改SELINUX的值為disable
SELINUX=disable
臨時(shí)關(guān)閉selinux,重啟之后,無效:
# 臨時(shí)關(guān)閉
setenforce 0
2.2.2.7 關(guān)閉swap分區(qū)
永久關(guān)閉swap分區(qū),需要重啟
sed -ri 's/.*swap.*/#&/' /etc/fstab
臨時(shí)關(guān)閉swap分區(qū),重啟之后,無效
swapoff -a
修改linux內(nèi)核參數(shù)
2.2.2.8 將橋接的IPv4流量傳遞到iptables的鏈
在每個(gè)節(jié)點(diǎn)上將橋接的IPv4流量傳遞到iptables的鏈
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
EOF
# 加載br_netfilter模塊
modprobe br_netfilter
# 查看是否加載
lsmod | grep br_netfilter
# 生效
sysctl --system
2.2.2.9 開啟ipvs
● 在kubernetes中service有兩種代理模型,一種是基于iptables,另一種是基于ipvs的。ipvs的性能要高于iptables的,但是如果要使用它,需要手動(dòng)載入ipvs模塊。
● 在每個(gè)節(jié)點(diǎn)安裝ipset和ipvsadm:
yum -y install ipset ipvsadm
# 或者
yum install ipset ipvsadmin -y
在所有節(jié)點(diǎn)執(zhí)行如下腳本:添加需要的模塊寫入腳本文件(直接復(fù)制下邊的命令回車即刻 )
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
授權(quán)、運(yùn)行、檢查是否加載:
chmod 755 /etc/sysconfig/modules/ipvs.modules
執(zhí)行腳本
/bin/bash /etc/sysconfig/modules/ipvs.modules
檢查是否加載:
lsmod | grep -e ipvs -e nf_conntrack_ipv4
2.2.2.10 重啟三臺(tái)機(jī)器
重啟三臺(tái)Linux機(jī)器:
reboot
2.2.3 每個(gè)節(jié)點(diǎn)安裝Docker、kubeadm、kubelet和kubectl
2.2.3.1 安裝Docker
- 安裝docker
# 切換docker鏡像源
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
# 查看當(dāng)前鏡像源中支持的docker鏡像
yum list docker-ce --showduplicates
# 安裝docker
# --setopt=obsoletes=0:不寫這個(gè)參數(shù),會(huì)自動(dòng)安裝更高版本
yum install --setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el7 -y
# yum -y install docker-ce-18.06.3.ce-3.el7
啟動(dòng)docker
systemctl start docker
# 設(shè)置開機(jī)啟動(dòng)docker
systemctl enable docker
查看docker版本
docker version
- 設(shè)置Docker鏡像加速器(上邊已經(jīng)設(shè)置過了,這里不做也行)
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{"exec-opts": ["native.cgroupdriver=systemd"], "registry-mirrors": ["https://du3ia00u.mirror.aliyuncs.com"], "live-restore": true,"log-driver":"json-file","log-opts": {"max-size":"500m", "max-file":"3"},"storage-driver": "overlay2"
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
2.2.3.2 添加阿里云的YUM軟件源
由于kubernetes的鏡像源在國外,非常慢,這里切換成國內(nèi)的阿里云鏡像源:
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[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
或者vim /etc/yum.repos.d/kubernetes.repo,然后輸入如下內(nèi)容
[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
2.2.3.3 安裝kubeadm、kubelet和kubectl
由于版本更新頻繁,這里指定版本號(hào)部署:
yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
為了實(shí)現(xiàn)Docker使用的cgroup drvier和kubelet使用的cgroup drver一致,建議修改"/etc/sysconfig/kubelet"文件的內(nèi)容:
vim /etc/sysconfig/kubelet
# 修改
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"
設(shè)置kubelet為開機(jī)自啟動(dòng)即可,由于沒有生成配置文件,集群初始化后自動(dòng)啟動(dòng):
systemctl enable kubelet
8完
2.2.4 查看k8s所需鏡像
查看k8s所需鏡像:
kubeadm config images list
下載鏡像:這里下載1.17.4
復(fù)制完上邊的命令后直接回車
使用for循環(huán)下載上邊的鏡像(復(fù)制完直接回車)
查看下載下來的鏡像
2.2.5 部署k8s的Master節(jié)點(diǎn)
部署k8s的Master節(jié)點(diǎn)(192.168.18.100):
情況一:
上邊已經(jīng)下載好了鏡像,可以直接使用下邊的命令初始化master即可
情況二:
如果之前沒有下載好鏡像,可以使用下邊命令在線下載安裝master
# 由于默認(rèn)拉取鏡像地址k8s.gcr.io國內(nèi)無法訪問,這里需要指定阿里云鏡像倉庫地址
kubeadm init \--apiserver-advertise-address=192.168.18.100 \--image-repository registry.aliyuncs.com/google_containers \--kubernetes-version v1.18.0 \--service-cidr=10.96.0.0/12 \--pod-network-cidr=10.244.0.0/16
根據(jù)提示消息,在Master節(jié)點(diǎn)上使用kubectl工具:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
2.2.6 部署k8s的Node節(jié)點(diǎn)
master安裝后,控制臺(tái)有如下命令:復(fù)制該命令到各個(gè)node節(jié)點(diǎn)去執(zhí)行,把node節(jié)點(diǎn)加入到master集群里
根據(jù)提示,在192.168.18.101和192.168.18.102上添加如下的命令:
# 把當(dāng)前node節(jié)點(diǎn)加入到集群里;注意,下邊的命令粘貼的是上邊master安裝后,控制臺(tái)打印出來的命令
kubeadm join 192.168.18.100:6443 --token jv039y.bh8yetcpo6zeqfyj \--discovery-token-ca-cert-hash sha256:3c81e535fd4f8ff1752617d7a2d56c3b23779cf9545e530828c0ff6b507e0e26
查看集群里的節(jié)點(diǎn)信息
可以看到,狀態(tài)是NotReady,即網(wǎng)絡(luò)還沒通,節(jié)點(diǎn)之間不能通信;
默認(rèn)的token有效期為24小時(shí),當(dāng)過期之后,該token就不能用了,這時(shí)可以使用如下的命令創(chuàng)建token:
kubeadm token create --print-join-command
# 生成一個(gè)永不過期的token
kubeadm token create --ttl 0 --print-join-command
2.2.7 部署CNI網(wǎng)絡(luò)插件
根據(jù)提示,在Master節(jié)點(diǎn)上使用kubectl工具查看節(jié)點(diǎn)狀態(tài):
kubectl get nodes
● kubernetes支持多種網(wǎng)絡(luò)插件,比如flannel、calico、canal等,任選一種即可,本次選擇flannel,如果網(wǎng)絡(luò)不行,可以使用本人提供的,當(dāng)然,你也可以安裝calico
● 在Master節(jié)點(diǎn)上獲取flannel配置文件(可能會(huì)失敗,如果失敗,請(qǐng)下載到本地,然后安裝):
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
下載下來后,修改文件里的倉庫為國內(nèi)的倉庫地址
使用配置文件啟動(dòng)flannel:
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
查看部署CNI網(wǎng)絡(luò)插件進(jìn)度:
kubectl get pods -n kube-system
再次在Master節(jié)點(diǎn)使用kubectl工具查看節(jié)點(diǎn)狀態(tài)
kubectl get nodes
查看集群健康狀況:
kubectl get cs
kubectl cluster-info
2.3 服務(wù)部署
2.3.1 前言
在Kubernetes集群中部署一個(gè)Nginx程序,測(cè)試下集群是否正常工作。
2.3.2 步驟
部署Nginx:(在master操作即可)
kubectl create deployment nginx --image=nginx:1.14-alpine
暴露端口:
# NodePort:集群外的瀏覽器可以訪問
kubectl expose deployment nginx --port=80 --type=NodePort
查看服務(wù)狀態(tài):
# svc:service
kubectl get pods,svc
2.4 kubernetes中kubectl命令自動(dòng)補(bǔ)全
yum install -y bash-completion
source /usr/share/bash-completion/bash_completion
source <(kubectl completion bash)
echo “source <(kubectl completion bash)” >> ~/.bashrc
vim /root/.bashrc
source /usr/share/bash-completion/bash_completion
source <(kubectl completion bash)
二 kubernetes集群環(huán)境搭建
2.1 前置知識(shí)點(diǎn)
目前生產(chǎn)部署Kubernetes 集群主要有兩種方式:
kubeadm
Kubeadm 是一個(gè)K8s 部署工具,提供kubeadm init 和kubeadm join,用于快速部署Kubernetes 集群。
官方地址:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/
二進(jìn)制包
從github 下載發(fā)行版的二進(jìn)制包,手動(dòng)部署每個(gè)組件,組成Kubernetes 集群。
Kubeadm 降低部署門檻,但屏蔽了很多細(xì)節(jié),遇到問題很難排查。如果想更容易可控,推薦使用二進(jìn)制包部署Kubernetes 集群,雖然手動(dòng)部署麻煩點(diǎn),期間可以學(xué)習(xí)很多工作原理,也利于后期維護(hù)。
2.2 kubeadm 部署方式介紹
kubeadm 是官方社區(qū)推出的一個(gè)用于快速部署kubernetes 集群的工具,這個(gè)工具能通過兩條指令完成一個(gè)kubernetes 集群的部署:
- 創(chuàng)建一個(gè)Master 節(jié)點(diǎn)kubeadm init
- 將Node 節(jié)點(diǎn)加入到當(dāng)前集群中$ kubeadm join <Master 節(jié)點(diǎn)的IP 和端口>
2.3 安裝要求
在開始之前,部署Kubernetes 集群機(jī)器需要滿足以下幾個(gè)條件:
- 一臺(tái)或多臺(tái)機(jī)器,操作系統(tǒng)CentOS7.x-86_x64
- 硬件配置:2GB 或更多RAM,2 個(gè)CPU 或更多CPU,硬盤30GB 或更多
- 集群中所有機(jī)器之間網(wǎng)絡(luò)互通
- 可以訪問外網(wǎng),需要拉取鏡像
- 禁止swap 分區(qū)
2.4 最終目標(biāo)
- 在所有節(jié)點(diǎn)上安裝Docker 和kubeadm
- 部署Kubernetes Master
- 部署容器網(wǎng)絡(luò)插件
- 部署Kubernetes Node,將節(jié)點(diǎn)加入Kubernetes 集群中
- 部署Dashboard Web 頁面,可視化查看Kubernetes 資源
2.5 準(zhǔn)備環(huán)境
角色 | IP地址 | 組件 |
---|---|---|
k8s-master01 | 192.168.5.3 | docker,kubectl,kubeadm,kubelet |
k8s-node01 | 192.168.5.4 | docker,kubectl,kubeadm,kubelet |
k8s-node02 | 192.168.5.5 | docker,kubectl,kubeadm,kubelet |
2.6 系統(tǒng)初始化
2.6.1 設(shè)置系統(tǒng)主機(jī)名以及 Host 文件的相互解析
hostnamectl set-hostname k8s-master01 && bash
hostnamectl set-hostname k8s-node01 && bash
hostnamectl set-hostname k8s-node02 && bash
cat <<EOF>> /etc/hosts
192.168.5.3 k8s-master01
192.168.5.4 k8s-node01
192.168.5.5 k8s-node02
EOF
scp /etc/hosts root@192.168.5.4:/etc/hosts
scp /etc/hosts root@192.168.5.5:/etc/hosts
2.6.2 安裝依賴文件(所有節(jié)點(diǎn)都要操作)
yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git
2.6.3 設(shè)置防火墻為 Iptables 并設(shè)置空規(guī)則(所有節(jié)點(diǎn)都要操作)
systemctl stop firewalld && systemctl disable firewalldyum -y install iptables-services && systemctl start iptables && systemctl enable iptables && iptables -F && service iptables save
2.6.4 關(guān)閉 SELINUX(所有節(jié)點(diǎn)都要操作)
swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstabsetenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
2.6.5 調(diào)整內(nèi)核參數(shù),對(duì)于 K8S(所有節(jié)點(diǎn)都要操作)
modprobe br_netfiltercat <<EOF> kubernetes.conf
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle=0
vm.swappiness=0 # 禁止使用 swap 空間,只有當(dāng)系統(tǒng) OOM 時(shí)才允許使用它
vm.overcommit_memory=1 # 不檢查物理內(nèi)存是否夠用
vm.panic_on_oom=0 # 開啟 OOM
fs.inotify.max_user_instances=8192
fs.inotify.max_user_watches=1048576
fs.file-max=52706963
fs.nr_open=52706963
net.ipv6.conf.all.disable_ipv6=1
net.netfilter.nf_conntrack_max=2310720
EOFcp kubernetes.conf /etc/sysctl.d/kubernetes.confsysctl -p /etc/sysctl.d/kubernetes.conf
2.6.6 調(diào)整系統(tǒng)時(shí)區(qū)(所有節(jié)點(diǎn)都要操作)
# 設(shè)置系統(tǒng)時(shí)區(qū)為 中國/上海
timedatectl set-timezone Asia/Shanghai
# 將當(dāng)前的 UTC 時(shí)間寫入硬件時(shí)鐘
timedatectl set-local-rtc 0
# 重啟依賴于系統(tǒng)時(shí)間的服務(wù)
systemctl restart rsyslog
systemctl restart crond
2.6.7 設(shè)置 rsyslogd 和 systemd journald(所有節(jié)點(diǎn)都要操作)
# 持久化保存日志的目錄
mkdir /var/log/journal
mkdir /etc/systemd/journald.conf.d
cat > /etc/systemd/journald.conf.d/99-prophet.conf <<EOF
[Journal]
# 持久化保存到磁盤
Storage=persistent# 壓縮歷史日志
Compress=yesSyncIntervalSec=5m
RateLimitInterval=30s
RateLimitBurst=1000# 最大占用空間 10G
SystemMaxUse=10G# 單日志文件最大 200M
SystemMaxFileSize=200M# 日志保存時(shí)間 2 周
MaxRetentionSec=2week# 不將日志轉(zhuǎn)發(fā)到 syslog
ForwardToSyslog=no
EOFsystemctl restart systemd-journald
2.6.8 kube-proxy開啟ipvs的前置條件(所有節(jié)點(diǎn)都要操作)
cat <<EOF> /etc/sysconfig/modules/ipvs.modules
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOFchmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
2.6.9 安裝 Docker 軟件(所有節(jié)點(diǎn)都要操作)
yum install -y yum-utils device-mapper-persistent-data lvm2yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repoyum install -y docker-ce## 創(chuàng)建 /etc/docker 目錄
mkdir /etc/dockercat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
}
}
EOF
mkdir -p /etc/systemd/system/docker.service.d
# 重啟docker服務(wù)
systemctl daemon-reload && systemctl restart docker && systemctl enable docker
上傳文件到/etc/yum.repos.d/
目錄下,也可以 代替 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
命令
docker-ce.repo
[docker-ce-stable]
name=Docker CE Stable - $basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/$basearch/stable
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg[docker-ce-stable-debuginfo]
name=Docker CE Stable - Debuginfo $basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/debug-$basearch/stable
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg[docker-ce-stable-source]
name=Docker CE Stable - Sources
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/source/stable
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg[docker-ce-test]
name=Docker CE Test - $basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/$basearch/test
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg[docker-ce-test-debuginfo]
name=Docker CE Test - Debuginfo $basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/debug-$basearch/test
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg[docker-ce-test-source]
name=Docker CE Test - Sources
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/source/test
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg[docker-ce-nightly]
name=Docker CE Nightly - $basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/$basearch/nightly
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg[docker-ce-nightly-debuginfo]
name=Docker CE Nightly - Debuginfo $basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/debug-$basearch/nightly
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg[docker-ce-nightly-source]
name=Docker CE Nightly - Sources
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/source/nightly
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
2.6.10 安裝 Kubeadm (所有節(jié)點(diǎn)都要操作)
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOFyum install -y kubelet kubeadm kubectl && systemctl enable kubelet
2.7 部署Kubernetes Master
2.7.1 初始化主節(jié)點(diǎn)(主節(jié)點(diǎn)操作)
kubeadm init --apiserver-advertise-address=192.168.5.3 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.21.1 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/config
2.7.2 加入主節(jié)點(diǎn)以及其余工作節(jié)點(diǎn)
kubeadm join 192.168.5.3:6443 --token h0uelc.l46qp29nxscke7f7 \--discovery-token-ca-cert-hash sha256:abc807778e24bff73362ceeb783cc7f6feec96f20b4fd707c3f8e8312294e28f
2.7.3 部署網(wǎng)絡(luò)
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
下邊是文件
---
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:name: psp.flannel.unprivilegedannotations:seccomp.security.alpha.kubernetes.io/allowedProfileNames: docker/defaultseccomp.security.alpha.kubernetes.io/defaultProfileName: docker/defaultapparmor.security.beta.kubernetes.io/allowedProfileNames: runtime/defaultapparmor.security.beta.kubernetes.io/defaultProfileName: runtime/default
spec:privileged: falsevolumes:- configMap- secret- emptyDir- hostPathallowedHostPaths:- pathPrefix: "/etc/cni/net.d"- pathPrefix: "/etc/kube-flannel"- pathPrefix: "/run/flannel"readOnlyRootFilesystem: false# Users and groupsrunAsUser:rule: RunAsAnysupplementalGroups:rule: RunAsAnyfsGroup:rule: RunAsAny# Privilege EscalationallowPrivilegeEscalation: falsedefaultAllowPrivilegeEscalation: false# CapabilitiesallowedCapabilities: ['NET_ADMIN', 'NET_RAW']defaultAddCapabilities: []requiredDropCapabilities: []# Host namespaceshostPID: falsehostIPC: falsehostNetwork: truehostPorts:- min: 0max: 65535# SELinuxseLinux:# SELinux is unused in CaaSPrule: 'RunAsAny'
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: flannel
rules:
- apiGroups: ['extensions']resources: ['podsecuritypolicies']verbs: ['use']resourceNames: ['psp.flannel.unprivileged']
- apiGroups:- ""resources:- podsverbs:- get
- apiGroups:- ""resources:- nodesverbs:- list- watch
- apiGroups:- ""resources:- nodes/statusverbs:- patch
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: flannel
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: flannel
subjects:
- kind: ServiceAccountname: flannelnamespace: kube-system
---
apiVersion: v1
kind: ServiceAccount
metadata:name: flannelnamespace: kube-system
---
kind: ConfigMap
apiVersion: v1
metadata:name: kube-flannel-cfgnamespace: kube-systemlabels:tier: nodeapp: flannel
data:cni-conf.json: |{"name": "cbr0","cniVersion": "0.3.1","plugins": [{"type": "flannel","delegate": {"hairpinMode": true,"isDefaultGateway": true}},{"type": "portmap","capabilities": {"portMappings": true}}]}net-conf.json: |{"Network": "10.244.0.0/16","Backend": {"Type": "vxlan"}}
---
apiVersion: apps/v1
kind: DaemonSet
metadata:name: kube-flannel-dsnamespace: kube-systemlabels:tier: nodeapp: flannel
spec:selector:matchLabels:app: flanneltemplate:metadata:labels:tier: nodeapp: flannelspec:affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/osoperator: Invalues:- linuxhostNetwork: truepriorityClassName: system-node-criticaltolerations:- operator: Existseffect: NoScheduleserviceAccountName: flannelinitContainers:- name: install-cniimage: quay.io/coreos/flannel:v0.14.0command:- cpargs:- -f- /etc/kube-flannel/cni-conf.json- /etc/cni/net.d/10-flannel.conflistvolumeMounts:- name: cnimountPath: /etc/cni/net.d- name: flannel-cfgmountPath: /etc/kube-flannel/containers:- name: kube-flannelimage: quay.io/coreos/flannel:v0.14.0command:- /opt/bin/flanneldargs:- --ip-masq- --kube-subnet-mgrresources:requests:cpu: "100m"memory: "50Mi"limits:cpu: "100m"memory: "50Mi"securityContext:privileged: falsecapabilities:add: ["NET_ADMIN", "NET_RAW"]env:- name: POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.name- name: POD_NAMESPACEvalueFrom:fieldRef:fieldPath: metadata.namespacevolumeMounts:- name: runmountPath: /run/flannel- name: flannel-cfgmountPath: /etc/kube-flannel/volumes:- name: runhostPath:path: /run/flannel- name: cnihostPath:path: /etc/cni/net.d- name: flannel-cfgconfigMap:name: kube-flannel-cfg
2.8 測(cè)試kubernetes 集群
2.8.1 部署nginx 測(cè)試
kubectl create deployment nginx --image=nginxkubectl expose deployment nginx --port=80 --type=NodePortkubectl get pod,svc
三 資源管理
3.1 資源管理介紹
在kubernetes中,所有的內(nèi)容都抽象為資源,用戶需要通過操作資源來管理kubernetes。
kubernetes的本質(zhì)上就是一個(gè)集群系統(tǒng),用戶可以在集群中部署各種服務(wù),所謂的部署服務(wù),其實(shí)就是在kubernetes集群中運(yùn)行一個(gè)個(gè)的容器,并將指定的程序跑在容器中。
kubernetes的最小管理單元是pod而不是容器,所以只能將容器放在
Pod
中,而kubernetes一般也不會(huì)直接管理Pod,而是通過Pod控制器
來管理Pod的。Pod可以提供服務(wù)之后,就要考慮如何訪問Pod中服務(wù),kubernetes提供了
Service
資源實(shí)現(xiàn)這個(gè)功能。當(dāng)然,如果Pod中程序的數(shù)據(jù)需要持久化,kubernetes還提供了各種
存儲(chǔ)
系統(tǒng)。
學(xué)習(xí)kubernetes的核心,就是學(xué)習(xí)如何對(duì)集群上的Pod、Pod控制器、Service、存儲(chǔ)
等各種資源進(jìn)行操作
3.2 YAML語言介紹
YAML是一個(gè)類似 XML、JSON 的標(biāo)記性語言。它強(qiáng)調(diào)以數(shù)據(jù)為中心,并不是以標(biāo)識(shí)語言為重點(diǎn)。因而YAML本身的定義比較簡(jiǎn)單,號(hào)稱"一種人性化的數(shù)據(jù)格式語言"。
xml:
<heima><age>15</age><address>Beijing</address>
</heima>
yml:
heima:age: 15address: Beijing
YAML的語法比較簡(jiǎn)單,主要有下面幾個(gè):
- 大小寫敏感
- 使用縮進(jìn)表示層級(jí)關(guān)系
- 縮進(jìn)不允許使用tab,只允許空格( 低版本限制 )
- 縮進(jìn)的空格數(shù)不重要,只要相同層級(jí)的元素左對(duì)齊即可
- '#'表示注釋
YAML支持以下幾種數(shù)據(jù)類型:
- 純量:單個(gè)的、不可再分的值
- 對(duì)象:鍵值對(duì)的集合,又稱為映射(mapping)/ 哈希(hash) / 字典(dictionary)
- 數(shù)組:一組按次序排列的值,又稱為序列(sequence) / 列表(list)
# 純量, 就是指的一個(gè)簡(jiǎn)單的值,字符串、布爾值、整數(shù)、浮點(diǎn)數(shù)、Null、時(shí)間、日期
# 1 布爾類型
c1: true (或者True)
# 2 整型
c2: 234
# 3 浮點(diǎn)型
c3: 3.14
# 4 null類型
c4: ~ # 使用~表示null
# 5 日期類型
c5: 2018-02-17 # 日期必須使用ISO 8601格式,即yyyy-MM-dd
# 6 時(shí)間類型
c6: 2018-02-17T15:02:31+08:00 # 時(shí)間使用ISO 8601格式,時(shí)間和日期之間使用T連接,最后使用+代表時(shí)區(qū)
# 7 字符串類型
c7: heima # 簡(jiǎn)單寫法,直接寫值 , 如果字符串中間有特殊字符,必須使用雙引號(hào)或者單引號(hào)包裹
c8: line1line2 # 字符串過多的情況可以拆成多行,每一行會(huì)被轉(zhuǎn)化成一個(gè)空格
# 對(duì)象
# 形式一(推薦):
heima:age: 15address: Beijing
# 形式二(了解):
heima: {age: 15,address: Beijing}
# 數(shù)組
# 形式一(推薦):
address:- 順義- 昌平
# 形式二(了解):
address: [順義,昌平]
小提示:
1 書寫yaml切記
:
后面要加一個(gè)空格2 如果需要將多段yaml配置放在一個(gè)文件中,中間要使用
---
分隔3 下面是一個(gè)yaml轉(zhuǎn)json的網(wǎng)站,可以通過它驗(yàn)證yaml是否書寫正確
https://www.json2yaml.com/convert-yaml-to-json
3.3 資源管理方式
下邊是三種創(chuàng)建pod的方式
-
命令式對(duì)象管理:直接使用命令去操作kubernetes資源
kubectl run nginx-pod --image=nginx:1.17.1 --port=80
-
命令式對(duì)象配置:通過命令配置和配置文件去操作kubernetes資源
kubectl create/patch -f nginx-pod.yaml
-
聲明式對(duì)象配置:通過apply命令和配置文件去操作kubernetes資源
apply:創(chuàng)建和更新資源(pod有的話就更新,沒有就創(chuàng)建)
kubectl apply -f nginx-pod.yaml
類型 | 操作對(duì)象 | 適用環(huán)境 | 優(yōu)點(diǎn) | 缺點(diǎn) |
---|---|---|---|---|
命令式對(duì)象管理 | 對(duì)象 | 測(cè)試 | 簡(jiǎn)單 | 只能操作活動(dòng)對(duì)象,無法審計(jì)、跟蹤 |
命令式對(duì)象配置 | 文件 | 開發(fā) | 可以審計(jì)、跟蹤 | 項(xiàng)目大時(shí),配置文件多,操作麻煩 |
聲明式對(duì)象配置 | 目錄 | 開發(fā) | 支持目錄操作 | 意外情況下難以調(diào)試 |
3.3.1 命令式對(duì)象管理
kubectl命令
kubectl是kubernetes集群的命令行工具,通過它能夠?qū)罕旧磉M(jìn)行管理,并能夠在集群上進(jìn)行容器化應(yīng)用的安裝部署。kubectl命令的語法如下:
kubectl [command] [type] [name] [flags]
comand:指定要對(duì)資源執(zhí)行的操作,例如create、get、delete,可以通過kubectl --help
命令查看所有命令
type:指定資源類型,比如deployment、pod、service
name:指定資源的名稱,名稱大小寫敏感
flags:指定額外的可選參數(shù)
# 查看所有pod
kubectl get pod # 查看某個(gè)pod
kubectl get pod pod_name# 查看某個(gè)pod,以yaml格式展示結(jié)果,yaml改為json就是以json格式顯示
kubectl get pod pod_name -o yaml
操作(comand類型)
kubernetes允許對(duì)資源進(jìn)行多種操作,可以通過–help查看詳細(xì)的操作命令
kubectl --help
經(jīng)常使用的操作有下面這些:
命令分類 | 命令 | 翻譯 | 命令作用 |
---|---|---|---|
基本命令 | create | 創(chuàng)建 | 創(chuàng)建一個(gè)資源 |
edit | 編輯 | 編輯一個(gè)資源 | |
get | 獲取 | 獲取一個(gè)資源 | |
patch | 更新 | 更新一個(gè)資源 | |
delete | 刪除 | 刪除一個(gè)資源 | |
explain | 解釋 | 展示資源文檔 | |
運(yùn)行和調(diào)試 | run | 運(yùn)行 | 在集群中運(yùn)行一個(gè)指定的鏡像 |
expose | 暴露 | 暴露資源為Service | |
describe | 描述 | 顯示資源內(nèi)部信息 | |
logs | 日志輸出容器在 pod 中的日志 | 輸出容器在 pod 中的日志 | |
attach | 纏繞進(jìn)入運(yùn)行中的容器 | 進(jìn)入運(yùn)行中的容器 | |
exec | 執(zhí)行容器中的一個(gè)命令 | 執(zhí)行容器中的一個(gè)命令 | |
cp | 復(fù)制 | 在Pod內(nèi)外復(fù)制文件 | |
rollout | 首次展示 | 管理資源的發(fā)布 | |
scale | 規(guī)模 | 擴(kuò)(縮)容Pod的數(shù)量 | |
autoscale | 自動(dòng)調(diào)整 | 自動(dòng)調(diào)整Pod的數(shù)量 | |
高級(jí)命令 | apply | rc | 通過文件對(duì)資源進(jìn)行配置 |
label | 標(biāo)簽 | 更新資源上的標(biāo)簽 | |
其他命令 | cluster-info | 集群信息 | 顯示集群信息 |
version | 版本 | 顯示當(dāng)前Server和Client的版本 |
資源類型(type)
kubernetes中所有的內(nèi)容都抽象為資源,可以通過下面的命令進(jìn)行查看:
kubectl api-resources
經(jīng)常使用的資源有下面這些:
資源分類 | 資源名稱 | 縮寫 | 資源作用 |
---|---|---|---|
集群級(jí)別資源 | nodes | no | 集群組成部分 |
namespaces | ns | 隔離Pod | |
pod資源 | pods | po | 裝載容器 |
pod資源控制器 | replicationcontrollers | rc | 控制pod資源 |
replicasets | rs | 控制pod資源 | |
deployments | deploy | 控制pod資源 | |
daemonsets | ds | 控制pod資源 | |
jobs | 控制pod資源 | ||
cronjobs | cj | 控制pod資源 | |
horizontalpodautoscalers | hpa | 控制pod資源 | |
statefulsets | sts | 控制pod資源 | |
服務(wù)發(fā)現(xiàn)資源 | services | svc | 統(tǒng)一pod對(duì)外接口 |
ingress | ing | 統(tǒng)一pod對(duì)外接口 | |
存儲(chǔ)資源 | volumeattachments | 存儲(chǔ) | |
persistentvolumes | pv | 存儲(chǔ) | |
persistentvolumeclaims | pvc | 存儲(chǔ) | |
配置資源 | configmaps | cm | 配置 |
secrets | 配置 |
下面以一個(gè)namespace / pod的創(chuàng)建和刪除簡(jiǎn)單演示下命令的使用:
# 創(chuàng)建一個(gè)namespace 名稱叫dev namespace可以簡(jiǎn)寫為ns
[root@master ~]# kubectl create namespace dev
namespace/dev created# 獲取namespace
[root@master ~]# kubectl get ns 除了dev,其他是k8s集群自帶的
NAME STATUS AGE
default Active 21h
dev Active 21s
kube-node-lease Active 21h
kube-public Active 21h
kube-system Active 21h# 在此namespace下創(chuàng)建并運(yùn)行一個(gè)nginx的Pod
[root@master ~]# kubectl run pod --image=nginx:latest -n dev
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
deployment.apps/pod created# 查看新創(chuàng)建的pod,默認(rèn)查詢default的namespace下的pod
[root@master ~]# kubectl get pod -n dev
NAME READY STATUS RESTARTS AGE
pod 1/1 Running 0 21s# 刪除指定ns下的的指定pod
[root@master ~]# kubectl delete pods pod-864f9875b9-pcw7x -n dev
pod "pod" deleted# 刪除指定的namespace
[root@master ~]# kubectl delete ns dev
namespace "dev" deleted
3.3.2 命令式對(duì)象配置
命令式對(duì)象配置就是使用命令配合配置文件一起來操作kubernetes資源。
1) 創(chuàng)建一個(gè)nginxpod.yaml,內(nèi)容如下:
#創(chuàng)建名字是dev的namespace
apiVersion: v1
kind: Namespace
metadata:name: dev#yml文件里,要寫兩個(gè)名字一樣的配置的話,需要使用---做分割
---#在dev下創(chuàng)建一個(gè)pod,pod名字是nginxpod,鏡像以及鏡像版本是nginx:1.17.1
apiVersion: v1
kind: Pod
metadata:name: nginxpodnamespace: dev
spec:containers:- name: nginx-containersimage: nginx:1.17.1
2)執(zhí)行create命令,創(chuàng)建資源:
[root@master ~]# kubectl create -f nginxpod.yaml
namespace/dev created
pod/nginxpod created
此時(shí)發(fā)現(xiàn)創(chuàng)建了兩個(gè)資源對(duì)象,分別是namespace和pod
查看名字是dev的namespace
kubectl get ns dev
查看dev下的pod
#pod可以寫成pods
kubectl get pod -n dev
3)執(zhí)行g(shù)et命令,查看資源:
[root@master ~]# kubectl get -f nginxpod.yaml
NAME STATUS AGE
namespace/dev Active 18sNAME READY STATUS RESTARTS AGE
pod/nginxpod 1/1 Running 0 17s
這樣就顯示了兩個(gè)資源對(duì)象的信息
4)執(zhí)行delete命令,刪除資源:
[root@master ~]# kubectl delete -f nginxpod.yaml
namespace "dev" deleted
pod "nginxpod" deleted
此時(shí)發(fā)現(xiàn)兩個(gè)資源對(duì)象被刪除了
總結(jié):命令式對(duì)象配置的方式操作資源,可以簡(jiǎn)單的認(rèn)為:命令 + yaml配置文件(里面是命令需要的各種參數(shù))
3.3.3 聲明式對(duì)象配置
聲明式對(duì)象配置跟命令式對(duì)象配置很相似,但是它只有一個(gè)命令apply。
# 首先執(zhí)行一次kubectl apply -f yaml文件,發(fā)現(xiàn)創(chuàng)建了資源,此處使用的nginxpod.yaml文件還是上邊創(chuàng)建的那個(gè)文件
[root@master ~]# kubectl apply -f nginxpod.yaml
namespace/dev created
pod/nginxpod created# 再次執(zhí)行一次kubectl apply -f yaml文件,發(fā)現(xiàn)說資源沒有變動(dòng)
[root@master ~]# kubectl apply -f nginxpod.yaml
namespace/dev unchanged
pod/nginxpod unchanged
總結(jié):其實(shí)聲明式對(duì)象配置就是使用apply描述一個(gè)資源最終的狀態(tài)(在yaml中定義狀態(tài))使用apply操作資源:如果資源不存在,就創(chuàng)建,相當(dāng)于 kubectl create如果資源已存在,就更新,相當(dāng)于 kubectl patch
擴(kuò)展:kubectl可以在node節(jié)點(diǎn)上運(yùn)行嗎 ?
kubectl的運(yùn)行是需要進(jìn)行配置的,它的配置文件是在master節(jié)點(diǎn)下的$HOME/.kube,如果想要在node節(jié)點(diǎn)運(yùn)行此命令,需要將master上的.kube文件復(fù)制到node節(jié)點(diǎn)上,即在master節(jié)點(diǎn)上執(zhí)行下面操作:
scp -r HOME/.kube node1: HOME/
使用推薦: 三種方式應(yīng)該怎么用 ?
創(chuàng)建/更新資源 使用聲明式對(duì)象配置 kubectl apply -f XXX.yaml
刪除資源 使用命令式對(duì)象配置 kubectl delete -f XXX.yaml
查詢資源 使用命令式對(duì)象管理 kubectl get(describe) 資源名稱
Kubernetes實(shí)戰(zhàn)