k8s 從0到1記錄文檔

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

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

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

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

首先嘗試在本地搭建一個(gè)k8s服務(wù)墙基,以實(shí)踐去學(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. 啟動(dòng)minikube
minikube start --vm-driver=xxx

image

此時(shí)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

運(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

  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

刪掉某個(gè)部署后桥氏,其運(yùn)行的pod以及replicaset全部自動(dòng)刪除温峭。

kubectl delete deployment [deployment-name]

  1. 其他常用指令

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

按不同級(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

  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)自動(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端口

  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ā)請(qǐng)求

  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ī)器已經(jīng)啟動(dòng)過k8s服務(wù),可以通過 kubeadm reset 盡力還原初始化命令對(duì)節(jié)點(diǎn)的修改堕伪。
  4. 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

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

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

  1. 多集群切換

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

  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

  • 要?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-filefake-key-file 是證書文件路徑名的占位符哀托。 你需要更改這些值,使之對(duì)應(yīng)你的環(huán)境中證書文件的實(shí)際路徑名劳秋。

有時(shí)你可能希望在這里使用 BASE64 編碼的數(shù)據(jù)而不是一個(gè)個(gè)獨(dú)立的證書文件仓手。 如果是這樣,你需要在鍵名上添加 -data 后綴玻淑。例如嗽冒, certificate-authority-dataclient-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. 去除污點(diǎn)

image

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

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

Presentation1_page-0001.jpg

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

注意:

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

借鑒:

  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)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市抒蚜,隨后出現(xiàn)的幾起案子掘鄙,更是在濱河造成了極大的恐慌,老刑警劉巖嗡髓,帶你破解...
    沈念sama閱讀 222,729評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件操漠,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡饿这,警方通過查閱死者的電腦和手機(jī)浊伙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來长捧,“玉大人嚣鄙,你說我怎么就攤上這事〈幔” “怎么了哑子?”我有些...
    開封第一講書人閱讀 169,461評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)肌割。 經(jīng)常有香客問我卧蜓,道長(zhǎng),這世上最難降的妖魔是什么把敞? 我笑而不...
    開封第一講書人閱讀 60,135評(píng)論 1 300
  • 正文 為了忘掉前任弥奸,我火速辦了婚禮,結(jié)果婚禮上先巴,老公的妹妹穿的比我還像新娘其爵。我一直安慰自己,他們只是感情好伸蚯,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評(píng)論 6 398
  • 文/花漫 我一把揭開白布摩渺。 她就那樣靜靜地躺著,像睡著了一般剂邮。 火紅的嫁衣襯著肌膚如雪摇幻。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,736評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音绰姻,去河邊找鬼枉侧。 笑死,一個(gè)胖子當(dāng)著我的面吹牛狂芋,可吹牛的內(nèi)容都是我干的榨馁。 我是一名探鬼主播,決...
    沈念sama閱讀 41,179評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼帜矾,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼翼虫!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起屡萤,我...
    開封第一講書人閱讀 40,124評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤珍剑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后死陆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體招拙,經(jīng)...
    沈念sama閱讀 46,657評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評(píng)論 3 342
  • 正文 我和宋清朗相戀三年措译,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了别凤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,872評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡领虹,死狀恐怖闻妓,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情掠械,我是刑警寧澤由缆,帶...
    沈念sama閱讀 36,533評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站猾蒂,受9級(jí)特大地震影響均唉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜肚菠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評(píng)論 3 336
  • 文/蒙蒙 一舔箭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蚊逢,春花似錦层扶、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至终抽,卻和暖如春戳表,著一層夾襖步出監(jiān)牢的瞬間桶至,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工匾旭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留镣屹,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,304評(píng)論 3 379
  • 正文 我出身青樓价涝,卻偏偏與公主長(zhǎng)得像女蜈,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子色瘩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容