結(jié)合個(gè)人學(xué)習(xí)方法硝烂,記錄歷程:
-
了解啥是k8s奔脐,用來解決什么問題测萎。
-
了解大致架構(gòu)和組件
- etcd 保存了整個(gè)集群的狀態(tài)闹伪;
- API Server 提供了資源操作的唯一入口沪铭,并提供認(rèn)證壮池、授權(quán)、訪問控制杀怠、API 注冊(cè)和發(fā)現(xiàn)等機(jī)制椰憋;
- Controller Manager 負(fù)責(zé)維護(hù)集群的狀態(tài),比如故障檢測(cè)赔退、自動(dòng)擴(kuò)展橙依、滾動(dòng)更新等;
- Scheduler 負(fù)責(zé)資源的調(diào)度硕旗,按照預(yù)定的調(diào)度策略將 Pod 調(diào)度到相應(yīng)的機(jī)器上窗骑;
- Kubelet 負(fù)責(zé)維護(hù)容器的生命周期,同時(shí)也負(fù)責(zé) Volume(CVI)和網(wǎng)絡(luò)(CNI)的管理漆枚;
- Container Runtime 負(fù)責(zé)鏡像管理以及 Pod 和容器的真正運(yùn)行(CRI)创译;
- Kube-proxy 負(fù)責(zé)為 Service 提供 cluster 內(nèi)部的服務(wù)發(fā)現(xiàn)和負(fù)載均衡;
-
本地快速部署一個(gè)k8s集群, 以minikube實(shí)現(xiàn)
首先嘗試在本地搭建一個(gè)k8s服務(wù)墙基,以實(shí)踐去學(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
- 啟動(dòng)minikube
minikube start --vm-driver=xxx
此時(shí)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
運(yùn)行一個(gè)名稱為nginx颗祝,副本數(shù)為3,標(biāo)簽為app=example纺蛆,鏡像為nginx:1.10吐葵,端口為80(默認(rèn)端口為80)的容器實(shí)例
kubectl run nginx --replicas=3 --labels="app=example" --image=nginx:1.10 --pot=80 #例子1
例子:
#運(yùn)行一個(gè)容器實(shí)例:
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
刪掉某個(gè)部署后桥氏,其運(yùn)行的pod以及replicaset全部自動(dòng)刪除温峭。
kubectl delete deployment [deployment-name]
-
其他常用指令
-
kubectl logs [pod-name]
: 查看某個(gè)資源日志 -
kubectl get pods
:查看所有pod 轉(zhuǎn)臺(tái), -w 動(dòng)態(tài)查看 -
kubectl describe pod [pod-name]
: 查看某的pod的狀態(tài) -
kubectl exec -ti [pod-name] -- bin/bash
: 進(jìn)入某個(gè)服務(wù) -
Kubectl edit deployment [deployment-name]
: 編輯某個(gè)部署
-
-
資源清單
按不同級(jí)別分類:
1. 命名空間級(jí)別
- 工作負(fù)載型資源 Pod ReplicaSet Deployment StatefulSet DaemenSet Job CronJob
- 服務(wù)發(fā)現(xiàn)及負(fù)載均衡型資源 Service Ingress
- 配置與存儲(chǔ)型資源 Volume CSI
- 特殊類型存儲(chǔ)卷: ConfigMap Secret DownwardAPI
2. 集群級(jí)別
Namespace Node Role ClusterRole RoleBinding ClusterRoleBinding
3. 元數(shù)據(jù)型
HPA PodTemplate LimitRange
查詢某個(gè)字段的具體含義: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)自動(dòng)分配一個(gè)僅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ā)請(qǐng)求
-
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ī)器已經(jīng)啟動(dòng)過k8s服務(wù),可以通過 kubeadm reset 盡力還原初始化命令對(duì)節(jié)點(diǎn)的修改堕伪。
kubeadm init
--pod-network-cidr=10.244.0.0/16
該命令執(zhí)行完后會(huì)有對(duì)應(yīng)的權(quán)限控制操作與join命令:
例如:kubeadm join 10.221.88.97:6443 --token neh3gd.9yws9ispiyfxjnmb --discovery-token-ca-
cert-hash sha256:9bd2808551e949ec42b37808ed1186b794d12d09a1bc3874bbb7a74fa9fe6267
令牌token一般24小時(shí)過期揖庄,如果之后想要添加節(jié)點(diǎn)入集群可以通過:
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
選項(xiàng)欠雌。 運(yùn)行
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é)點(diǎn)隔離
在缺省情況下富俄,出于安全原因禁炒,集群不會(huì)master節(jié)點(diǎn)上調(diào)度pod而咆。如果你想在master節(jié)點(diǎn)上調(diào)度pod,例如在單節(jié)點(diǎn)Kubernetes集群上幕袱,請(qǐng)運(yùn)行如下命令:
kubectl taint nodes --all node-role.kubernetes.io/control-plane- node-role.kubernetes.io/master-
-
多集群切換
我在本地起了一套minikube 服務(wù)暴备,然后呢為了驗(yàn)證內(nèi)網(wǎng)訪問不通的問題,我又用kubeadm在本地建了另一套集群们豌,而此時(shí)kubectl 無(wú)法操作 新建的這個(gè)集群涯捻,故由此引申多集群切換的問題,一般有兩種解決方法望迎,第一種是修改默認(rèn)的config障癌,第二種是以一個(gè)文件為模板,然后配置其各項(xiàng)內(nèi)容擂煞,最后在引用的時(shí)候: 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
要?jiǎng)h除用戶混弥,可以運(yùn)行
kubectl --kubeconfig=config-demo config unset users.<name>
要?jiǎng)h除集群,可以運(yùn)行
kubectl --kubeconfig=config-demo config unset clusters.<name>
要?jiǎng)h除上下文对省,可以運(yùn)行
kubectl --kubeconfig=config-demo config unset contexts.<name>
--kubeconfig=config-demo , 這里添加該參數(shù)時(shí)蝗拿,就會(huì)修改對(duì)應(yīng)config-demo里面的值。
fake-ca-file
蒿涎、fake-cert-file
和 fake-key-file
是證書文件路徑名的占位符哀托。 你需要更改這些值,使之對(duì)應(yīng)你的環(huán)境中證書文件的實(shí)際路徑名劳秋。
有時(shí)你可能希望在這里使用 BASE64 編碼的數(shù)據(jù)而不是一個(gè)個(gè)獨(dú)立的證書文件仓手。 如果是這樣,你需要在鍵名上添加 -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
去除污點(diǎn)
kubectl taint nodes --all node-role.kubernetes.io/control-plane- node-role.kubernetes.io/master-
Demo:k8s搭建一個(gè)mongoDB服務(wù)
思路:由上至下考慮結(jié)構(gòu)添坊,從瀏覽器訪問外部服務(wù),到mongoDB Express操作數(shù)據(jù)庫(kù)箫锤,需要搭建一個(gè)可以被集群外部訪問的Service贬蛙,該Service與部署了mongDB Express的pod進(jìn)行卯定。然后谚攒,mongDB Express訪問內(nèi)部Service阳准,該Service與部署了MongoDB的pod卯定。
該過程中馏臭,除了需要用到Pod野蝇,Service,Deployment,還需要用到 Secret , ConfigMap 資源類存儲(chǔ)绕沈,需要注意的是乱灵,后者需要提前部署于集群中。
在編寫yaml文件時(shí)七冲,Deployment 和 Service 可以寫在一塊,---
三橫線分開即可规婆。
注意:
- 服務(wù)與部署之間的卯定
- Service 外部訪問設(shè)置 type: LoadBalancer
- 資源文件引用的寫法
- 文件部署先后順序
- 調(diào)用docker 容器時(shí)澜躺,注意其端口與需要的字段信息
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
借鑒: