k8s 從0到1記錄文檔

結(jié)合個人學(xué)習(xí)方法,記錄歷程:

  1. 了解啥是k8s,用來解決什么問題。

  2. 了解大致架構(gòu)和組件

image
  • 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ù)載均衡;
  1. 本地快速部署一個k8s集群, 以minikube實現(xiàn)

首先嘗試在本地搭建一個k8s服務(wù),以實踐去學(xué)習(xí)理論。

  1. 安裝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/

  1. 安裝minikube
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube

  1. 啟動minikube
minikube start --vm-driver=xxx

image

此時k8s服務(wù)就成功部署了,可以通過 minikube dashboard 查看集群狀態(tài)。既然服務(wù)部署成功了,開始嘗試在集群里面部署服務(wù)吧~

  1. kubectl

kubectl 是 Kubernetes 的命令行工具(CLI),是 Kubernetes 用戶和管理員必備的管理工具。

  1. 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>

  1. 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

  1. 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

  1. delete

刪掉某個部署后,其運行的pod以及replicaset全部自動刪除。

kubectl delete deployment [deployment-name]

  1. 其他常用指令

    1. kubectl logs [pod-name] : 查看某個資源日志
    2. kubectl get pods :查看所有pod 轉(zhuǎn)臺, -w 動態(tài)查看
    3. kubectl describe pod [pod-name] : 查看某的pod的狀態(tài)
    4. kubectl exec -ti [pod-name] -- bin/bash : 進(jìn)入某個服務(wù)
    5. Kubectl edit deployment [deployment-name] : 編輯某個部署
  2. 資源清單

按不同級別分類:

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

  1. 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

  1. Service

Different Service types explained:

image
  • 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端口

  1. Secret

apiVersion: v1
kind: Secret
metadata:
 name: mysecret
type: Opaque
data:
 mongodb-root-username: dXNlcm5hbWU=
 mongodb-root-password: cGFzc3dvcmQ=

  1. ConfigMap

apiVersion: v1
kind: ConfigMap
metadata:
  name: mongodb-configmap
data:
  database_url: mongodb-service

  1. Ingress

分發(fā)請求

  1. Helm (Package Manager)

reuse the configuration

  1. Stateful

  2. 部分思考:

    1. Kubectl create/replace 和 apply 的區(qū)別
      1. create刪除現(xiàn)有資源然后再通過replace觸發(fā)更新,apply僅更新yaml中存在的屬性
      2. create要求文件必須完整,apply不必
  3. kubeadm搭建集群:

    1. 如果機器已經(jīng)啟動過k8s服務(wù),可以通過 kubeadm reset 盡力還原初始化命令對節(jié)點的修改。
  4. 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

  1. 安裝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

  1. 控制平面節(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-

  1. 多集群切換

我在本地起了一套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...

  1. 增加cluster到config中:

sudo kubectl config set-cluster kubernetes --server=``https://10.221.88.97:6443 --certificate-authority=fake-ca-file

  1. 將用戶詳細(xì)信息添加到配置文件中:

kubectl config set-credentials kubernetes-admin --client-certificate=fake-cert-file --client-key=fake-key-seefile

  1. 將上下文詳細(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-filefake-key-file 是證書文件路徑名的占位符。 你需要更改這些值,使之對應(yīng)你的環(huán)境中證書文件的實際路徑名。

有時你可能希望在這里使用 BASE64 編碼的數(shù)據(jù)而不是一個個獨立的證書文件。 如果是這樣,你需要在鍵名上添加 -data 后綴。例如, certificate-authority-data、client-certificate-dataclient-key-data。

  1. 多角色切換

  2. Debug

  3. container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:Network plugin returns error: cni plugin not initialized

  4. 去除污點

image

kubectl taint nodes --all node-role.kubernetes.io/control-plane- node-role.kubernetes.io/master-

Demo:k8s搭建一個mongoDB服務(wù)

Presentation1_page-0001.jpg

思路:由上至下考慮結(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 可以寫在一塊,--- 三橫線分開即可。

注意:

  1. 服務(wù)與部署之間的卯定
  2. Service 外部訪問設(shè)置 type: LoadBalancer
  3. 資源文件引用的寫法
  4. 文件部署先后順序
  5. 調(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

借鑒:

  1. https://kubernetes.io/zh-cn/docs/home/
  2. http://www.coderdocument.com/docs/kubernetes/v1.14/started/production_environment/installing_kubernetes_with_deployment_tools/bootstrapping_clusters_with_kubeadm/creating_single_master_cluster_with_kubeadm.html
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容