k8s-基礎篇
- 2022 年 2 月 5 日
- 筆記
搭建k8s環境
Myapp鏡像部署
擴容pod
自愈
負載均衡
DNS
外網訪問
滾動更新
YAML方式部署
獨立部署pod
RS副本控制器
Deployment-自動擴容
Deployment-更新版本
Deployment-回滾版本
daemonset
job
cronJob
初始化容器
鏈接://pan.baidu.com/s/1U_AWBEXsjESZ2eDPIH4TFA
提取碼:gmze
網盤裡有一些配置文件和系統組件可以自行下載使用。環境搭建很麻煩,如果發現失敗可與我聯繫或按照文檔重試幾次。以下步驟是完全可用的!
搭建k8s環境
環境準備
環境3台centos虛擬機每台虛擬機2核2G,一個master兩個node。搭建k8s環境如沒有特殊說明所有操作均在三個節點同時操作。
部署docker
kubeadm[一鍵安裝k8s]
集群安裝
網盤中有鏡像文件kubeadm-basic.images

k8s部署

flflannel插件

節點Join
節點加入需要token和sha256,在主節點上執行以下命令獲取。
創建token
kubeadm token create
m9rrtc.2cm48k5w6ymsprwt
查看token可能有多個,選擇一個沒有過期的即可
kubeadm token list
獲取 CA 證書 sha256 編碼 hash 值
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed ‘s/^.* //’
4a77cfd6f9e2a16a7a45351369275f102b9986b469d3f9f9865a87050e4bf0dc
在子節點執行以下命令
kubeadm join 主機IP:6443 –token 59mzkj.26xap2hzdhm74ptq –discovery-token-ca-cert-hash sha256:18acdb7c02c6ea696307fde451f44ea0d216e6ccb6777a2a87002d7d45f3845c
在主節點查看。我這裡node2虛擬機關閉了,電腦不行。正常情況下都是Ready


Myapp鏡像部署
需要在master和node上配置docker鏡像。
//cr.console.aliyun.com/cn-hangzhou/instances/mirrors?accounttraceid=0cd89c7411274ee48cb11fad06368ba3fxyw
創建pod(部署服務) : kubectl run myapp –image=ikubernetes/myapp:v1 –port=80 –replicas=2 (replicas指定pod數量默認1)
查詢pod創建詳細資訊: kubectl describe pod myapp-554864fdf4-f4gw9
查詢pod: kubectl get pod
查詢pod詳細資訊: kubectl get pod -o
Kubectl run 首先創建deployment對象,kubectl run 指令執行後創建了3個資源對象(deployment,rs,pod)
注意: 上面這條指令沒有指定副本數量,默認創建了1個pod。如果只有master節點則創建失敗,至少有一個node
如果要刪除徹底刪除pod需要先刪除deployment,然後pod會自動刪除。
kubectl delete deployment myapp
擴容pod
kubectl scale deployment myapp –replicas=4
也可以再次縮容
自愈
K8s管理的pod不僅僅可以一鍵式部署,一鍵式擴容,同時k8s管理的pod還具有自愈能力。也就是說當pod發生故障,宕機,k8s將會自動對pod件重建,因此k8s的pod的副本永遠處於高可用狀態。
刪除所有的pod,查看pod是否還存在: kubectl delete pod –all
負載均衡
Pod有多個副本,訪問pod副本必須實現負載均衡訪問,那麼這個負載均衡訪問是通過service來實現的。因此對一組pod副本創建一個service,進行負載均衡
對一組pod副本創建service: kubectl expose deployment myapp –port=30000 –target-port=80
kubectl get svc
通過測試發現,k8s默認使用輪訓策略。
kubectl delete svc/myapp 刪除service
DNS
安裝k8s時候,安裝dns組件,dns(域名解析伺服器,根據域名解析出真實ip地址,通過dns可以通過服務名進行相互的訪問)
在容器內部通過服務名訪問其他容器
kubectl exec -it myapp-554864fdf4-wsr7h — sh
wget myapp:30000(service名稱) — 測試通過,說明可以通過服務名稱,訪問到外部網路,因此dns伺服器是ok的。
外網訪問
Service 和pod 之間的通訊都屬於區域網通訊訪問。無法對外網直接提供服務,service是一個虛擬化的概念,是一個虛擬IP地址,沒有與之對應的物理硬體資料,無法直接對外網提供服務,必須藉助於物理硬體資源進行數據包轉發。
kubectl edit svc myapp — 編輯service對應資源對象配置文件,通過修改ip類型,來綁定物理埠。
可以發現32727就是我們所開闢物理埠,此埠可以在配置文件中自定義,也可以默認即可,默認埠範圍:30000 – 32767
滾動更新
項目迭代,不停的發布新的版本,如何實現不停機更新。一鍵式更新操作.滾動更新,發現訪問時候,已經是v2版本的服務.原來的pod開始沒有關閉
等到新版本的pod發布後才把老版本刪除。
YAML方式部署
通過yaml配置文件方式一鍵部署服務。yaml的詳細配置在網盤連接里有。YAML語法規範.md
現在我們要部署一個Nginx服務,先拉去一個docker鏡像,其實可以讓k8s自己下載,但是我要給Nginx打一個tag
docker pull nginx
編寫yaml文件在網盤鏈接中有


apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: default
spec:
replicas: 2
selector:
matchLabels:
app: mynginx
release: stable
env: test
template:
metadata:
labels:
app: mynginx
release: stable
env: test
spec:
containers:
- name: my-nginx
image: nginx:v1
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
View Code
kubectl apply -f nginx-deploy.yaml 執行腳本
編寫service.yaml


apiVersion: v1
kind: Service
metadata:
name: nginx-svc
namespace: default
spec:
type: NodePort
selector:
app: mynginx
release: stable
env: test
ports:
- name: http
port: 80
targetPort: 80
nodePort: 30003
View Code
獨立部署pod
自主式的pod: 單獨定義一個pod,這個沒有沒有副本控制器管理,也沒有對應deployment,可以直接刪除pod並且不會自愈。


apiVersion: v1
kind: Pod
metadata:
name: init-pod
labels:
app: myapp
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
View Code
kubectl apply -f init-pod.yaml 執行腳本
RS副本控制器
ReplicationController (RC)用來確保容器應用的副本數始終保持在用戶定義的副本數,即如果有容器異常退出,會自動創建新的Pod來替代;而如果異常多出來的容器也會自動回收;
在新版本的Kubernetes中建議使用Replicaset來取代ReplicationController. ReplicaSet跟 ReplicationController沒有本質的不同,只是名字不一樣,並且ReplicaSet支援集合式的selector;


apiVersion: extensions/v1beta1
kind: ReplicaSet
metadata:
name: frontend
spec:
replicas: 3
selector:
matchLabels:
tier: frontend
template:
metadata:
labels:
tier: frontend
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
View Code
pod刪除後可以自愈
修改pod的標籤後pod就會脫離RS而RS也會重新生成一個pod
刪除副本控制器後pod也會刪除
Deployment-自動擴容
Deployment可以保證在升級時只有一定數量的Pod是down的。默認的,它會確保至少有比期望的Pod數量少一個是up狀態(最多一個不可用)
Deployment同時也可以確保只創建出超過期望數量的一定數量的Pod,默認的,它會確保最多比期望的Pod數量多一個的Pod是up的(最多1個surge )


apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
View Code
kubectl autoscale deployment nginx-deployment –min=2 –max=5 –cpu-percent=80
這條指令是說最少兩個pod最多5個單個pod的cpu使用率達到80則創建副本。
Deployment-更新版本
kubectl set image deployment appdeployment(deployment名稱) nginx(container名稱)=ikubernetes/myapp:v2(要更新的鏡像)
Deployment-回滾版本
kubectl rollout undo deployment appdeployment(deployment名稱)
daemonset
確保只運行一個副本,運行在集群中每一個節點上。而deployment可能只將pod運行在一個節點上。daemonset沒有RS


apiVersion: apps/v1
kind: DaemonSet
metadata:
name: my-deamon
namespace: default
labels:
app: daemonset
spec:
selector:
matchLabels:
app: my-daemonset
template:
metadata:
labels:
app: my-daemonset
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
View Code
job
job負責處理任務,即僅執行一次的任務,下面這個job從倉庫拉去一個鏡像,執行一個循環列印。


apiVersion: batch/v1
kind: Job
metadata:
name: job-demo
spec:
template:
metadata:
name: job-demo
spec:
restartPolicy: Never
containers:
- name: counter
image: busybox
command:
- "bin/sh"
- "-c"
- "for i in 9 8 7 6 5 4 3 2 1; do echo $i; done"
View Code
cronJob
cronJob其實就是在`Job`的基礎上加上了時間調度,我們可以:在給定的時間點運行一個任務,也可以周期性地在給定時間點運行。
以下配置是1分鐘創建一個job執行


apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: cronjob-demo
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
restartPolicy: OnFailure
containers:
- name: hello
image: busybox
args:
- "bin/sh"
- "-c"
- "for i in 9 8 7 6 5 4 3 2 1; do echo $i; done"
View Code
初始化容器
Pod能夠持有多個容器,應用運行在容器裡面,但是它也可能有一個或多個先於應用容器啟動的Init容器。Init容器與普通的容器非常像,除了如下兩點:1 Init容器總是運行到成功完成為止 2 每個Init容器都必須在下一個Init容器啟動之前成功完成
如果Pod的Init容器失敗,Kubernetes會不斷地重啟該Pod,直到Init容器成功為止。然而,如果Pod對應的restartPolicy為Never,它不會重新啟動。
以下配置為初始化容器休眠2分鐘後創建。然後應用容器才會創建


apiVersion: v1
kind: Pod
metadata:
name: init-pod
labels:
app: myapp
spec:
containers:
- name: myapp
image: nginx
initContainers:
- name: init-mydb
image: nginx
command: ['sh', '-c', 'echo -n "running at " && date +%T && sleep 120']
View Code