結(jié)合個人學(xué)習(xí)方法,記錄歷程:
-
了解啥是k8s,用來解決什么問題。
-
了解大致架構(gòu)和組件
- etcd 保存了整個集群的狀態(tài);
- API Server 提供了資源操作的唯一入口,并提供認(rèn)證、授權(quán)、訪問控制、API 注冊和發(fā)現(xiàn)等機制;
- Controller Manager 負(fù)責(zé)維護(hù)集群的狀態(tài),比如故障檢測、自動擴(kuò)展、滾動更新等;
- Scheduler 負(fù)責(zé)資源的調(diào)度,按照預(yù)定的調(diào)度策略將 Pod 調(diào)度到相應(yīng)的機器上;
- Kubelet 負(fù)責(zé)維護(hù)容器的生命周期,同時也負(fù)責(zé) Volume(CVI)和網(wǎng)絡(luò)(CNI)的管理;
- Container Runtime 負(fù)責(zé)鏡像管理以及 Pod 和容器的真正運行(CRI);
- Kube-proxy 負(fù)責(zé)為 Service 提供 cluster 內(nèi)部的服務(wù)發(fā)現(xiàn)和負(fù)載均衡;
-
本地快速部署一個k8s集群, 以minikube實現(xiàn)
首先嘗試在本地搭建一個k8s服務(wù),以實踐去學(xué)習(xí)理論。
- 安裝kubectl:
curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl
chmod +x kubectl
sudo mv kubectl /usr/local/bin/
- 安裝minikube
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
- 啟動minikube
minikube start --vm-driver=xxx
此時k8s服務(wù)就成功部署了,可以通過 minikube dashboard 查看集群狀態(tài)。既然服務(wù)部署成功了,開始嘗試在集群里面部署服務(wù)吧~
-
kubectl
kubectl 是 Kubernetes 的命令行工具(CLI),是 Kubernetes 用戶和管理員必備的管理工具。
-
namespace:
方法一:命令
kubectl create namespace <insert-namespace-name-here>
方法二:create my-namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
name: <insert-namespace-name-here>
Then run:
kubectl create -f ./my-namespace.yaml
刪除namespace:
kubectl delete namespaces <insert-some-namespace-name>
-
run
運行一個名稱為nginx,副本數(shù)為3,標(biāo)簽為app=example,鏡像為nginx:1.10,端口為80(默認(rèn)端口為80)的容器實例
kubectl run nginx --replicas=3 --labels="app=example" --image=nginx:1.10 --pot=80 #例子1
例子:
#運行一個容器實例:
kubectl run demo --image=yeasy/simple-web:latest
#暴露服務(wù):
kubectl expose pod demo --port=80 --type=NodePort
# 訪問服務(wù):
minikube service demo
-
create
Create a deployment inside kubernetes cluster
# 根據(jù)鏡像來創(chuàng)建
kubectl create deployment hello-minikube --image=k8s.gcr.io/echoserver:1.4
# 根據(jù)yaml文件創(chuàng)建
kubectl create -f demo-deployment.yaml
# 暴露服務(wù), NodePort方可被外部訪問
kubectl expose deployment hello-minikube --type=NodePort --port=8080
-
delete
刪掉某個部署后,其運行的pod以及replicaset全部自動刪除。
kubectl delete deployment [deployment-name]
-
其他常用指令
-
kubectl logs [pod-name]: 查看某個資源日志 -
kubectl get pods:查看所有pod 轉(zhuǎn)臺, -w 動態(tài)查看 -
kubectl describe pod [pod-name]: 查看某的pod的狀態(tài) -
kubectl exec -ti [pod-name] -- bin/bash: 進(jìn)入某個服務(wù) -
Kubectl edit deployment [deployment-name]: 編輯某個部署
-
-
資源清單
按不同級別分類:
1. 命名空間級別
- 工作負(fù)載型資源 Pod ReplicaSet Deployment StatefulSet DaemenSet Job CronJob
- 服務(wù)發(fā)現(xiàn)及負(fù)載均衡型資源 Service Ingress
- 配置與存儲型資源 Volume CSI
- 特殊類型存儲卷: ConfigMap Secret DownwardAPI
2. 集群級別
Namespace Node Role ClusterRole RoleBinding ClusterRoleBinding
3. 元數(shù)據(jù)型
HPA PodTemplate LimitRange
查詢某個字段的具體含義:kubectl explain resource-name
-
Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: mongodb-deployment
labels:
app: mongodb
spec: #This spec for deployment
replicas: 1
selector:
matchLabels:
app: mongodb
template:
metadata:
labels:
app: mongodb
spec: #This spec for pod
containers:
- name: mongodb
image: mongo
ports:
- containerPort: 27017
env:
- name: MONGO_INITDB_ROOT_USERNAME
valueFrom: # get value from k8s secret
secretKeyRef:
name: mysecret # target secret name
key: mongodb-root-username # key
- name: MONGO_INITDB_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret
key: mongodb-root-password
-
Service
Different Service types explained:
- ClusterIP Services: (default type)自動分配一個僅cluster內(nèi)部訪問的虛擬IP
- Headless Services: No cluster IP address is assigned ! spec.clusterIP=None
- NodePort Services: nodePort Range: 30000 - 32767
- LoadBalancer Services: NodePort and ClusterIP Service are create automatically
apiVersion: v1
kind: Service
metadata:
name: mongodb-service
spec:
selector:
app: mongodb
ports:
- port: 27017 # pod 端口
targetPort: 27017 # service接收端口
protocol: TCP
服務(wù)接收 targetport的消息發(fā)送到pod的port端口
-
Secret
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
mongodb-root-username: dXNlcm5hbWU=
mongodb-root-password: cGFzc3dvcmQ=
-
ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
name: mongodb-configmap
data:
database_url: mongodb-service
-
Ingress
分發(fā)請求
-
Helm (Package Manager)
reuse the configuration
-
Stateful
-
部分思考:
- Kubectl create/replace 和 apply 的區(qū)別
- create刪除現(xiàn)有資源然后再通過replace觸發(fā)更新,apply僅更新yaml中存在的屬性
- create要求文件必須完整,apply不必
- Kubectl create/replace 和 apply 的區(qū)別
-
kubeadm搭建集群:
- 如果機器已經(jīng)啟動過k8s服務(wù),可以通過 kubeadm reset 盡力還原初始化命令對節(jié)點的修改。
kubeadm init--pod-network-cidr=10.244.0.0/16
該命令執(zhí)行完后會有對應(yīng)的權(quán)限控制操作與join命令:
例如:kubeadm join 10.221.88.97:6443 --token neh3gd.9yws9ispiyfxjnmb --discovery-token-ca-
cert-hash sha256:9bd2808551e949ec42b37808ed1186b794d12d09a1bc3874bbb7a74fa9fe6267
令牌token一般24小時過期,如果之后想要添加節(jié)點入集群可以通過:
kubeadm token create :新建令牌
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //' :新建discovery-token-ca-cert-hash
- 安裝pod網(wǎng)絡(luò)插件 kube-flannel.yaml :為了Flannel能夠正常工作,需要為
kubeadm init命令傳遞--pod-network-cidr=10.244.0.0/16選項。 運行
sysctl net.bridge.bridge-nf-call-iptables=1
將 /proc/sys/net/bridge/bridge-nf-call-iptables 設(shè)置為1,從而將橋接的IPV4流量傳遞至iptables鏈。并執(zhí)行:
kubectl apply -f kube-flannel.yml
- 控制平面節(jié)點隔離
在缺省情況下,出于安全原因,集群不會master節(jié)點上調(diào)度pod。如果你想在master節(jié)點上調(diào)度pod,例如在單節(jié)點Kubernetes集群上,請運行如下命令:
kubectl taint nodes --all node-role.kubernetes.io/control-plane- node-role.kubernetes.io/master-
-
多集群切換
我在本地起了一套minikube 服務(wù),然后呢為了驗證內(nèi)網(wǎng)訪問不通的問題,我又用kubeadm在本地建了另一套集群,而此時kubectl 無法操作 新建的這個集群,故由此引申多集群切換的問題,一般有兩種解決方法,第一種是修改默認(rèn)的config,第二種是以一個文件為模板,然后配置其各項內(nèi)容,最后在引用的時候: export KUBECONFIG="${KUBECONFIG}:config-demo:config-demo-2"
新創(chuàng)建的集群admin.conf文件如下:
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: xxx...
server: https://10.221.88.97:6443
name: kubernetes
contexts:
- context:
cluster: kubernetes
user: kubernetes-admin
name: kubernetes-admin@kubernetes
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
users:
- name: kubernetes-admin
user:
client-certificate-data: xxx...
client-key-data: xxx...
- 增加cluster到config中:
sudo kubectl config set-cluster kubernetes --server=``https://10.221.88.97:6443 --certificate-authority=fake-ca-file
- 將用戶詳細(xì)信息添加到配置文件中:
kubectl config set-credentials kubernetes-admin --client-certificate=fake-cert-file --client-key=fake-key-seefile
- 將上下文詳細(xì)信息添加到配置文件中:
kubectl config --kubeconfig=config-demo set-context dev-frontend --cluster=development --namespace=frontend --user=developer
要刪除用戶,可以運行
kubectl --kubeconfig=config-demo config unset users.<name>要刪除集群,可以運行
kubectl --kubeconfig=config-demo config unset clusters.<name>要刪除上下文,可以運行
kubectl --kubeconfig=config-demo config unset contexts.<name>
--kubeconfig=config-demo , 這里添加該參數(shù)時,就會修改對應(yīng)config-demo里面的值。
fake-ca-file、fake-cert-file 和 fake-key-file 是證書文件路徑名的占位符。 你需要更改這些值,使之對應(yīng)你的環(huán)境中證書文件的實際路徑名。
有時你可能希望在這里使用 BASE64 編碼的數(shù)據(jù)而不是一個個獨立的證書文件。 如果是這樣,你需要在鍵名上添加 -data 后綴。例如, certificate-authority-data、client-certificate-data 和 client-key-data。
-
多角色切換
-
Debug
container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:Network plugin returns error: cni plugin not initialized
去除污點
kubectl taint nodes --all node-role.kubernetes.io/control-plane- node-role.kubernetes.io/master-
Demo:k8s搭建一個mongoDB服務(wù)

思路:由上至下考慮結(jié)構(gòu),從瀏覽器訪問外部服務(wù),到mongoDB Express操作數(shù)據(jù)庫,需要搭建一個可以被集群外部訪問的Service,該Service與部署了mongDB Express的pod進(jìn)行卯定。然后,mongDB Express訪問內(nèi)部Service,該Service與部署了MongoDB的pod卯定。
該過程中,除了需要用到Pod,Service,Deployment,還需要用到 Secret , ConfigMap 資源類存儲,需要注意的是,后者需要提前部署于集群中。
在編寫yaml文件時,Deployment 和 Service 可以寫在一塊,--- 三橫線分開即可。
注意:
- 服務(wù)與部署之間的卯定
- Service 外部訪問設(shè)置 type: LoadBalancer
- 資源文件引用的寫法
- 文件部署先后順序
- 調(diào)用docker 容器時,注意其端口與需要的字段信息
demo文件:
https://github.com/Da-Qi/publicFile/blob/master/mongo-configmap.yaml
https://github.com/Da-Qi/publicFile/blob/master/mongo-express.yaml
https://github.com/Da-Qi/publicFile/blob/master/mongo-secret.yaml
https://github.com/Da-Qi/publicFile/blob/master/mongo.yaml
借鑒: