YAML基础知识及搭建一台简洁版guestbook
一,前言
前面我們已經搭建過簡易版k8s集群了,在此基礎上可以搭建一個簡潔版guestbook ,以便來學習k8s創建pod的整個過程。
二,在此之前,我們還需要學習一下YAML基礎知識
YAML 基礎
YAML?是專門用來寫配置文件的語言,非常簡潔和強大,遠比JSON格式方便。YAML語言(發音 /?j?m?l/)的設計目標,就是方便人類讀寫。它實質上是一種通用的數據串行化格式。
它的基本語法規則如下:
- 大小寫敏感
- 使用縮進表示層級關系
- 縮進時不允許使用Tab鍵,只允許使用空格。
- 縮進的空格數目不重要,只要相同層級的元素左側對齊即可
- #?表示注釋,從這個字符一直到行尾,都會被解析器忽略。
在我們的kubernetes中,你只需要兩種結構類型就行了:
- Lists
- Maps
也就是說,你可能會遇到Lists的Maps和Maps的Lists,等等。不過不用擔心,你只要掌握了這兩種結構也就可以了,其他更加復雜的我們暫不討論。
Maps
首先我們來看看Maps,我們都知道Map是字典,就是一個key:value的鍵值對,Maps可以讓我們更加方便的去書寫配置信息,例如:
--- apiVersion: v1kind: Pod?
第一行的---是分隔符,是可選的,在單一文件中,可用連續三個連字號---區分多個文件。這里我們可以看到,我們有兩個鍵:kind 和 apiVersion,他們對應的值分別是:v1和Pod。上面的 YAML 文件轉換成 JSON 格式的話,你肯定就容易明白了:
{"apiVersion": "v1","kind": "pod" } ?我們在創建一個相對復雜一點的 YAML 文件,創建一個 KEY 對應的值不是字符串而是一個 Maps:
--- apiVersion: v1 kind: Pod metadata:name: kube100-sitelabels:app: web?
上面的 YAML 文件,metadata 這個 KEY 對應的值就是一個Maps了,而且嵌套的 labels 這個 KEY 的值又是一個Map,你可以根據你自己的情況進行多層嵌套。
上面我們也提到了 YAML 文件的語法規則,YAML 處理器是根據行縮進來知道內容之間的嗯關聯性的。比如我們上面的 YAML 文件,我用了兩個空格作為縮進,空格的數量并不重要,但是你得保持一致,并且至少要求一個空格(什么意思?就是你別一會縮進兩個空格,一會縮進4個空格)。我們可以看到 name 和 labels 是相同級別的縮進,所以 YAML 處理器就知道了他們屬于同一個 MAP,而 app 是 labels 的值是因為 app 的縮進更大。
注意:在 YAML 文件中絕對不要使用 tab 鍵。
同樣的,我們可以將上面的 YAML 文件轉換成 JSON 文件:
{"apiVersion": "v1","kind": "Pod","metadata": {"name": "kube100-site","labels": {"app": "web"}} }或許你對上面的 JSON 文件更熟悉,但是你不得不承認 YAML 文件的語義化程度更高吧?
Lists
Lists就是列表,說白了就是數組,在 YAML 文件中我們可以這樣定義:
args- Cat- Dog- Fish你可以有任何數量的項在列表中,每個項的定義以破折號(-)開頭的,與父元素直接可以縮進一個空格。對應的 JSON 格式如下:
{"args": [ 'Cat', 'Dog', 'Fish' ] }當然,list 的子項也可以是 Maps,Maps 的子項也可以是list如下所示:
--- apiVersion: v1 kind: Pod metadata:name: kube100-sitelabels:app: web spec:containers:- name: front-endimage: nginxports:- containerPort: 80- name: flaskapp-demoimage: jcdemo/flaskappports:- containerPort: 5000比如這個 YAML 文件,我們定義了一個叫 containers 的 List 對象,每個子項都由 name、image、ports 組成,每個 ports 都有一個 key 為 containerPort 的 Map 組成,同樣的,我們可以轉成如下 JSON 格式文件:
{"apiVersion": "v1","kind": "Pod","metadata": {"name": "kube100-site","labels": {"app": web" }},"spec": {"containers": [{"name": "front-end","image": "nginx","ports": [{"containerPort": "80"}]}, {"name": "flaskapp-demo","image": "jcdemo/flaskapp","ports": [{"containerPort": "5000"}]}]} }是不是覺得用 JSON 格式的話文件明顯比 YAML 文件更復雜了呢?
?
三,創建pod
使用 YAML 創建 Pod
現在我們已經對 YAML 文件有了大概的了解了,我相信你應該沒有之前那么懵逼了吧?我們還是來使用 YAML 文件來創建一個 Deployment 。
#創建pod的過程,都在master上進行操作。
#如下是需要用到的YAML文件
1,redis-master-deployment.yaml配置文件
?#注意,配置文件中 image此處使用的我本地harbor上的image,你也可以直接寫注釋行的image:redis 。即可從外網下載redis鏡像,此過程pod啟動較慢,需要耐心等待。
#下文中出現的任何image均可被替換為自己的本地的image
?
2,redis-master-service.yaml配置文件
1 [root@master guestbook]# cat redis-master-service.yaml 2 apiVersion: v1 3 kind: Service 4 metadata: 5 name: redis-master 6 labels: 7 app: redis 8 role: master 9 tier: backend 10 spec: 11 ports: 12 # the port that this service should serve on 13 - port: 6379 14 targetPort: 6379 15 selector: 16 app: redis 17 role: master 18 tier: backend?
3,redis-slave-deployment.yaml
1 [root@master guestbook]# cat redis-slave-deployment.yaml 2 apiVersion: extensions/v1beta1 3 kind: Deployment 4 metadata: 5 name: redis-slave 6 spec: 7 replicas: 2 8 template: 9 metadata: 10 labels: 11 app: redis 12 role: slave 13 tier: backend 14 spec: 15 containers: 16 - name: slave 17 image: 192.168.200.10/redis/redis:slave 18 19 resources: 20 requests: 21 cpu: 100m 22 memory: 100Mi 23 env: 24 - name: GET_HOSTS_FROM 25 value: env 26 ports: 27 - containerPort: 6379#注 此處image可以替換為:image: kubeguide/guestbook-redis-slave
?
4,redis-slave-service.yaml配置文件
1 [root@master guestbook]# cat redis-slave-service.yaml 2 apiVersion: v1 3 kind: Service 4 metadata: 5 name: redis-slave 6 labels: 7 app: redis 8 role: slave 9 tier: backend 10 spec: 11 ports: 12 # the port that this service should serve on 13 - port: 6379 14 selector: 15 app: redis 16 role: slave 17 tier: backend?
5,frontend-deployment.yaml配置文件
1 [root@master guestbook]# cat frontend-deployment.yaml 2 apiVersion: extensions/v1beta1 3 kind: Deployment 4 metadata: 5 name: frontend 6 spec: 7 replicas: 3 8 template: 9 metadata: 10 labels: 11 app: guestbook 12 tier: frontend 13 spec: 14 containers: 15 - name: php-redis 16 image: kubeguide/guestbook-php-frontend 17 resources: 18 requests: 19 cpu: 100m 20 memory: 100Mi 21 env: 22 - name: GET_HOSTS_FROM 23 value: env 24 ports: 25 - containerPort: 80?6,frontend-service.yaml配置文件
1 [root@master guestbook]# cat frontend-service.yaml 2 apiVersion: v1 3 kind: Service 4 metadata: 5 name: frontend 6 labels: 7 app: guestbook 8 tier: frontend 9 spec: 10 type: NodePort 11 ports: 12 # the port that this service should serve on 13 - port: 80 14 nodePort: 30001 15 selector: 16 app: guestbook 17 tier: frontend?
四,啟動pod
1,啟動redis master
使用deployment確保只有一個pod在運行(當某個節點down了,deploy會在另一個健康的node啟動redis master),但可能會有數據丟失。
[root@master guestbook]# kubectl create -f redis-master-deployment.yamldeployment "redis-master" created?
2,啟動master service
一個kubernetes service會對一個或多個container進行負載均衡,這是通過我們上面redis-master中定義的labels元數據實現的,值得注意的是,在redis中只有一個master,但是我們依然為它創建一個service,這是因為這樣我們就能使用一個elastic IP來路由到具體某一個master。 ??
kubernetes集群中的service是通過container中的環境變量實現服務發現的,service基于pod label實現container的負載均衡。 ??
在第一步中創建的pod包含了一個label“name=redis-master”,service的selector字段決定了service將流量轉發給哪個pod,port和targetPort信息定義了service proxy運行在什么端口。
[root@master guestbook]# kubectl create -f redis-master-service.yaml service "redis-master" created#查看創建的service[root@master guestbook]# kubectl get service NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE frontend 10.254.206.198 <nodes> 80:30001/TCP 5d kubernetes 10.254.0.1 <none> 443/TCP 8d nginx 10.254.178.122 <pending> 8088:32488/TCP 4d redis-master 10.254.90.116 <none> 6379/TCP 5d redis-slave 10.254.248.244 <none> 6379/TCP 5d3,同樣的方式創建其他pod,如果出現是吧,可打開/var/log/message/下進行查看。
4,在master上查看創建的pod詳細信息
1 #查看service信息 2 [root@master guestbook]# kubectl get service 3 NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE 4 frontend 10.254.206.198 <nodes> 80:30001/TCP 5d 5 kubernetes 10.254.0.1 <none> 443/TCP 8d 6 nginx 10.254.178.122 <pending> 8088:32488/TCP 4d 7 redis-master 10.254.90.116 <none> 6379/TCP 5d 8 redis-slave 10.254.248.244 <none> 6379/TCP 5d 9 10 11 [root@master guestbook]# kubectl get service --all-namespaces 12 NAMESPACE NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE 13 default frontend 10.254.206.198 <nodes> 80:30001/TCP 5d 14 default kubernetes 10.254.0.1 <none> 443/TCP 8d 15 default nginx 10.254.178.122 <pending> 8088:32488/TCP 4d 16 default redis-master 10.254.90.116 <none> 6379/TCP 5d 17 default redis-slave 10.254.248.244 <none> 6379/TCP 5d 18 kube-system kubernetes-dashboard 10.254.22.70 <nodes> 80:30912/TCP 4d 19 20 #查看pod信息 21 [root@master guestbook]# kubectl get pods --all-namespaces -o wide 22 NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE 23 default frontend-1308123497-bvpkx 1/1 Running 0 5d 10.255.98.3 192.168.20.75 24 default frontend-1308123497-lg52q 1/1 Running 0 5d 10.255.39.4 192.168.20.76 25 default frontend-1308123497-z67ct 1/1 Running 0 5d 10.255.34.2 192.168.20.74 26 default nginx-1151984195-19ms4 1/1 Running 0 4d 10.255.34.4 192.168.20.74 27 default redis-master-1610630896-zmv8f 1/1 Running 0 5d 10.255.39.2 192.168.20.76 28 default redis-slave-2804703596-bg8k5 1/1 Running 0 5d 10.255.39.3 192.168.20.76 29 default redis-slave-2804703596-m2s6n 1/1 Running 0 5d 10.255.98.2 192.168.20.75 30 kube-system kubernetes-dashboard-1924705696-x47dd 1/1 Running 0 4d 10.255.34.3 192.168.20.74 31 32 33 [root@master guestbook]# kubectl get deployments 34 NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE 35 frontend 3 3 3 3 5d 36 nginx 1 1 1 1 4d 37 redis-master 1 1 1 1 5d 38 redis-slave 2 2 2 2 5d 39 40 [root@master guestbook]# kubectl get deployments --all-namespaces 41 NAMESPACE NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE 42 default frontend 3 3 3 3 5d 43 default nginx 1 1 1 1 4d 44 default redis-master 1 1 1 1 5d 45 default redis-slave 2 2 2 2 5d 46 kube-system kubernetes-dashboard 1 1 1 1 4d 47 [root@master guestbook]#?
5,可以通過任意node節點來訪問
http://192.168.20.74:30001/
?
五,總結
?由此可見,訪問任意工作節點都可以,可以得出,此處可以使用VIP來實現HA。
在創建pod過程中,如果出現問題都可以通過/var/log/message 日志動態查看。
?
轉載于:https://www.cnblogs.com/fuhai0815/p/9700761.html
總結
以上是生活随笔為你收集整理的YAML基础知识及搭建一台简洁版guestbook的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 重绘和回流
- 下一篇: Python 爬取斗图啦图片