k8s簡介
kubernetes,簡稱K8s,是用8代替8個字符“ubernete”而成的縮寫。是一個開源的,用於管理雲平台中多個主機上的容器化的應用,Kubernetes的目標是讓部署容器化的應用簡單並且高效(powerful),Kubernetes提供了應用部署,規划,更新,維護的一種機制
k8s的資源對象
master
kubernetes里的master指的是集群控制節點,在每個kubernetes集群里都需要有一個master來負責真個集群的管理和控制,在master上運行着以下關鍵進程:
- API Server(kube-apiserver):提供了HTTP Rest接口的關鍵服務進程,是kubernetes里所有資源的增刪改查等操作的唯一入口,也是集群中的入口進程
- Controller Manager(kube-controller-manager):kubernetes里所有資源對象的自動化控制中心,可以理解成為資源對象的“大總管”
- Scheduler:(kube-scheduler):負責資源調度(pod調度)的進程,相當於公交公司的“調度室”
- Etcd:所有資源對象的數據被會被保存到etcd中,持久化
node
除了master,kubernetes集群中其他機器被稱之為 Node,node可以是一台物理機,也可以是一台虛擬機,node是kubernetes集群中的工作負載節點,每個node都會被master分配一些工作負載(docker容器),當某個node宕機時,其他節點會接管故障節點的資源,node節點當中的重要進程:
- kubelet:負責pod對應容器的創建,啟停等任務,另外kubelet與master緊密協作,隨時報告給master自身的情況,如CPU,內存,操作系統,docker版本等
- kube-proxy:實現kubernetes server的通信與負載均衡機制的重要組件
- docker engine:docker引擎,負責本主機的容器創建 和管理工作
pod
pod是kubernetes最重要的基本概念,是kubernetes調度的最小單元,每個container都有一個pause容器,稱之為根容器,屬於kubernetes平台的一部分,一個pod可以運行多個容器(container),但是一般來說我們一個pod只運行一個container,如下圖:
k8s集群架構圖
集群的搭建(master)
簡單了解k8s的資源對象之后咱們就先來搭建一個k8s集群,因為我們的后續操作都是建立在k8s集群當中的,因此,我們就需要先搭建一個k8s集群,這樣也便於大家的理解
環境准備
三台機器:
- master:192.168.254.13
- node1:192.168.254.12
- node2:192.168.254.10
- 基於主機名通信:/etc/hosts;
- 時間同步
- 關閉firewalld,selinux
規划如下:
第一步:確保master和node中開啟內核參數
echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables note:如果提示沒有bridge-nf-call-iptables 解決辦法: [root@localhost ~]# modprobe br_netfilter
第二步:配置docker yum源和kubenetes yum源並且安裝
#安裝kubernetes的yum源
vim /etc/yum.repos.d/kubernetes.repo [kubernetes] name = kubernetes baseurl = https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ enabled = 1 gpgcheck = 1 gpgkey = https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg #安裝docker的yum源 cd /etc/yum.repos.d/ wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum install kubelet kubeadm kubectl docker-ce -y
第三步:添加初始化額外參數,忽略swap報警信息
[root@localhost ~]# vim /etc/sysconfig/kubelet KUBELET_EXTRA_ARGS="--fail-swap-on=false" [root@localhost ~]# service docker restart
第四步:初始化集群
[root@localhost ~]# kubeadm init --kubernetes-version=v1.15.2 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16 --ignore-preflight-errors=Swap --ignore-preflight-errors=NumCPU --image-repository registry.aliyuncs.com/google_containers 解釋: --apiserver-advertise-address:指定用 Master 的哪個IP地址與 Cluster的其他節點通信。 --service-cidr:指定Service網絡的范圍,即負載均衡VIP使用的IP地址段。 --pod-network-cidr:指定Pod網絡的范圍,即Pod的IP地址段。 --image-repository:Kubenetes默認Registries地址是 k8s.gcr.io,在國內並不能訪問 gcr.io,在1.13版本中我們可以增加-image-repository參數,默認值是 k8s.gcr.io,將其指定為阿里雲鏡像地址:registry.aliyuncs.com/google_containers。 --kubernetes-version=v1.13.3:指定要安裝的版本號。 --ignore-preflight-errors=:忽略運行時的錯誤,例如上面目前存在[ERROR NumCPU]和[ERROR Swap],忽略這兩個報錯就是增加--ignore-preflight-errors=NumCPU 和--ignore-preflight-errors=Swap的配置即可。
第五步:記錄以下內容,因為后期我們的node節點需要通過ca認證加入到集群當中
kubeadm join 192.168.254.13:6443 --token 71ovlq.w7pf14czrwi7f1ag --discovery-token-ca-cert-hash sha256:d2a9a1aa23fdbcd42711a222c959026073cf0a70f37a87806233d8319c66feb4
第六步:按照提示完成以下三步
[root@localhost ~]# mkdir -p $HOME/.kube [root@localhost ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config [root@localhost ~]# chown $(id -u):$(id -g) $HOME/.kube/config
第七步:查看節點狀態
這里的NotReady是因為咱們還沒有部署網絡
[root@localhost ~]# kubectl get node NAME STATUS ROLES AGE VERSION localhost.localdomain NotReady master 8h v1.15.2
第八步:查看組件狀態
[root@localhost ~]# kubectl get cs NAME STATUS MESSAGE ERROR controller-manager Healthy ok scheduler Healthy ok etcd-0 Healthy {"health":"true"}
第九步:部署flannel網絡(github)
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml 若下載失敗可以從阿里雲上pull [root@master1 ~]# docker pull registry.cn-hangzhou.aliyuncs.com/rsq_kubeadm/flannel:v0.11.0-amd64 [root@master1 ~]# docker tag registry.cn-hangzhou.aliyuncs.com/rsq_kubeadm/flannel:v0.11.0-amd64 quay.io/coreos/flannel:v0.11.0-amd64 [root@master1 ~]# docker rmi registry.cn-hangzhou.aliyuncs.com/rsq_kubeadm/flannel:v0.11.0-amd64
集群的搭建(2個node節點)
對於2個node節點的配置跟master節點的1,2,3步一樣,這里就不在寫了,直接跳到第四步
第四步:節點加入集群,也就是部署master時候的第五步
[root@localhost ~]#kubeadm join 192.168.254.13:6443 --token wug9gq.m9j7hhmvvy9ag8kk --discovery-token-ca-cert-hash sha256:6f8a056391bf04c3911465c581e78376e1d35eb309641105ddd69ce5eb47c591 --ignore-preflight-errors=Swap
第五步:在master節點上用一下命令查看,以下狀態是代表ok
[root@master ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION master Ready master 10h v1.15.3 node1 Ready <none> 10h v1.15.3 node2 Ready <none> 10h v1.15.3
補充
1.如果發現以上錯誤說明master節點token失效,需要在master上重新生成 [root@localhost ~]# kubeadm token create --print-join-command 3.如果node機器曾經加入過集群,要重新加入需要kubeadm reset重置,然后在join [root@localhost ~]# kubeadm reset 4.如果忘掉token [root@master ~]# kubeadm token list
5.如果忘掉hash串 [root@master]openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
kubectl命令
kubectl命令是用來在k8s集群當中進行增刪改查pod的重要命令,它的常用命令如下:
kubectl get nodes #獲取節點信息 kubectl get pods -n kube-system #獲取kube-system名稱空間內的信息 kubectl get pods -n kube-system -o wide #獲取kube-system名稱空間的詳細信息 kubectl get cs #獲取component組件的狀態 kubectl get ns #獲取所有名稱空間的狀態 kubectl describe node NODENAME #查看節點的詳細信息 kubectl cluster-info #集群信息 kubectl delete pod httpd1 #刪除所創建的pod kubectl apply #針對於清單文件創建pod,也可以用這個命令進行更新,他會檢查etcd中的數據,把不同地方同步 kubectl patch #打補丁,比如replacas從1修改成5 kubectl rollout undo #回滾 kubectl expose #創建一個service kubectl scale #擴容或者縮容 kubectl edit #編輯pod或者service清單文件
例子:
1.啟動pod,跑nginx服務(在這里的80端口只能被各個pod所訪問,集群外的機器無法訪問,因為如果pod死掉會重新起一個新pod,但是ip會改變,因此我們在訪問服務時不能以pod的ip為准,因此,需要serviceip) [root@master ~]#kubectl run nginx-deployment --image=nginx:1.14-alpine --port=80 --replicas=1 2.獲取pod名稱信息,然后映射給service [root@master ~]# kubectl get pods NAME READY STATUS RESTARTS AGE nginx-deployment-675947b94d-vwcnj 1/1 Running 0 145m nginx1-7f4f664fbf-c54z6 1/1 Running 0 145m 3.查看一個pod的標簽,在用describe svc SERVICE去查看標簽選擇器是否一致 [root@master ~]# kubectl get pods --show-labels; NAME READY STATUS RESTARTS AGE LABELS nginx-6db489d4b7-bk4sr 1/1 Running 0 71m pod-template-hash=6db489d4b7,run=nginx nginx-6db489d4b7-gmwsg 1/1 Running 0 74m pod-template-hash=6db489d4b7,run=nginx 4.暴露端口80端口集群網絡 [root@master ~]# kubectl expose deployment nginx-deployment --name=nginx --port=80 --target-port=80 --protocol=TCP service/nginx exposed 解釋: --name: 創建的服務名稱 --port: service端口 --target-port: pod端口 --protocol: 協議 deployment: 后面跟創建pod的名字 5.查看服務ip,剛才的nginx服務ip就位10.99.108.60(這里的ip,也是只能在集群內部各節點中訪問,集群外無法訪問) [root@master ~]# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 15h nginx ClusterIP 10.99.108.60 <none> 80/TCP 7m1s 6.進入到容器交互界面 kubectl exec -it nginx-56b8c64cb4-t97vb -- /bin/bash #假如當前pod只有一個容器,運行以下命令即可 7.增加原有服務pod數量(動態擴容和縮容) kubectl scale --replicas=6 deployment nginx 8.滾動更新 kubectl set image deployment nginx nginx=nginx:1.14-alpine 查看滾動更新狀態 kubectl rollout status deployment nginx 如果更新完成之后發現有問題我們還可以做回滾操作 kubectl rollout undo deployment nginx 9.如果想要讓集群以外的客戶端訪問,需要修改pod的service kubectl edit svc nginx type: ClusterIP替換成type:NodePort即可