# 1、啟動Kubernates
開始我們需要一個運行的K8s集群。詳細的已經在啟動K8s集群的章節解釋過了。
## Task
啟動一個單節點的集群使用幫助腳本。幫助腳本將會啟動API server,Master,一個代理和DNS發現。Web App使用DNS發現找到Redis從節點來存儲數據。
```
launch.sh
```
launch.sh文件:
```
#!/bin/bash
echo Waiting for Kubernetes to start...
while [ ! -f /root/.kube/config ]
do
sleep 1
done
echo Kubernetes started
if [ -f /root/.kube/start ]; then
/root/.kube/start
fi
```
## 健康檢查
檢查所有組件是否啟動使用下面的健康檢查:
```
kubectl cluster-info
kubectl get nodes
```
如果節點返回NotReady,然后需要繼續等待。重試之前多等一會。
# 2、Redis 主節點控制器
啟動應用的第一步是啟動Redis主節點。一個K8s服部署只要有兩個部署,一個RC(復制控制器)和一個Service。
復制控制器定義了有多少個實例應該被運行,要使用的Docker鏡像,標識服務的名稱。其他選項用于配置和發現。使用上面的編輯器查看YAML定義。
如果Redis出故障了,復制控制器將重啟它在另一個活動的節點上。
redis-master.service.yaml
```
apiVersion: v1
kind: ReplicationController
metadata:
name: redis-master
labels:
name: redis-master
spec:
replicas: 1
selector:
name: redis-master
template:
metadata:
labels:
name: redis-master
spec:
containers:
- name: master
image: redis:3.0.7-alpine
ports:
- containerPort: 6379
```
## 創建復制控制器(RC)
在這個例子上,YAML文件定義了一個名叫redis-master的redis服務器,它使用官方的redis運行在6379端口。kubectl create命令使用YAML定義并指示主節點啟動控制器。
```
kubectl create -f redis-master-controller.yaml
```
## 運行了什么?
上面的命令運行了復制控制器,查看:
```
kubectl get rc
```
所有的容器描述為Pod。pod是組成特定應用程序的容器的集合,例如Redis。你可以查看這個使用:
```
kubectl get pods
```
# 3、Redis 主節點 Service
第二部分就是Service,一個K8s服務就是一個命名的負載均衡器,它代理流量到一個或更多容器。即使容器是在不同的節點上,這個代理仍是有用的。
Service代理在集群內進行通信,很少向外部接口公開端口。
當你啟動一個service,看起來你不能使用curl或者netcat連接它,除非你作為K8s的一部分啟動它。推薦的方法是用一個負載均衡器服務去處理外部通信。
redis-master-service.yaml文件:
```yaml
apiVersion: v1
kind: Service
metadata:
name: redis-master
labels:
name: redis-master
spec:
ports:
# the port that this service should serve on
- port: 6379
targetPort: 6379
selector:
name: redis-master
```
## 創建Service
這個YAML文件定義了復制控制器的名字redis-master,和應該被代理的端口。
```
kubectl create -f redis-master-service.yaml
```
列出和描述 Service
```
kubectl get services
```
```
kubectl describe service redis-master
```
# 4、復制從節點pods
在這個例子中,我們將會運行redis從節點,它從主節點復制數據。更多Redis復制的詳細信息查閱[http://redis.io/topics/replication](http://redis.io/topics/replication)。
想先前描述的那樣,控制器定義服務如何運行。在這個例子中,我們需要決定服務如何發現其他pods。這個YAML將GET\_HOSTS\_FROM屬性表示為DNS。您可以將其更改為使用yaml中的環境變量,但這會引入創建順序依賴關系,因為需要運行服務才能定義環境變量。
redis-slave-controller.yaml文件
```
apiVersion: v1
kind: ReplicationController
metadata:
name: redis-slave
labels:
name: redis-slave
spec:
replicas: 2
selector:
name: redis-slave
template:
metadata:
labels:
name: redis-slave
spec:
containers:
- name: worker
image: gcr.io/google_samples/gb-redisslave:v1
env:
- name: GET_HOSTS_FROM
value: dns
# If your cluster config does not include a dns service, then to
# instead access an environment variable to find the master
# service's host, comment out the 'value: dns' line above, and
# uncomment the line below.
# value: env
ports:
- containerPort: 6379
```
## 啟動Redis從節點控制器
在這種情況下,我們將會使用鏡像kubernates/redis-slave:v2啟動兩個pod實例。它將通過DNS連接到redis-master。
```
kubcetl create -f redis-slave-controller.yaml
```
列出復制控制器
```
kubectl get rc
```
# 5、Redis 從節點 Service
與前面一樣,我們需要使我們的從節點能夠被傳入的請求訪問。這是通過啟動一個知道如何與redis-slave通信的服務來實現的。
因為我們有兩個復制的pod,service將會在這兩個pod之間提供負載均衡。
啟動Redis從節點Service
```
kubectl create -f redis-slave-service.yaml
```
```
kubectl get services
```
# 6、前端復制pod
數據服務啟動后,現在我們可以部署web應用。部署web應用的方式和我們之前部署pod是一樣的。
## 啟動前臺
YAML定義了一個叫做frontend的service。它使用鏡像 gcr.io/googlesamples/gb-frontend:v3 。這個復制控制器將會確保總有3個pod存在。
fronted-controller.yaml文件:
```
apiVersion: v1
kind: ReplicationController
metadata:
name: frontend
labels:
name: frontend
spec:
replicas: 3
selector:
name: frontend
template:
metadata:
labels:
name: frontend
spec:
containers:
- name: php-redis
image: gcr.io/google_samples/gb-frontend:v3
env:
- name: GET_HOSTS_FROM
value: dns
# If your cluster config does not include a dns service, then to
# instead access environment variables to find service host
# info, comment out the 'value: dns' line above, and uncomment the
# line below.
# value: env
ports:
- containerPort: 80
```
```
kubectl create -f fronted-controller.yaml
```
列出控制器和pods
```
kubectl get rc
```
```
kubectl get pods
```
## PHP 代碼
這個PHP代碼使用HTTP和JSON與Redis通信。寫操作請求redis-master,讀操作請求redis-slave節點。
# 7、Guestbook 前端 Service
訪問前端,我們需要啟動一個service,配置代理。
## 啟動代理
YAML文件定義了一個NodePort的service。NodePort可以設置一個在整個集群都眾所周知的端口。這類似于在Docker中的 -p 80:80。
在這里,我們定義我們的web app運行在80端口,但是我們在30080端口暴露服務。
fronted-service.yaml文件:
```
apiVersion: v1
kind: Service
metadata:
name: frontend
labels:
name: frontend
spec:
# if your cluster supports it, uncomment the following to automatically create
# an external load-balanced IP for the frontend service.
# type: LoadBalancer
type: NodePort
ports:
# the port that this service should serve on
- port: 80
nodePort: 30080
selector:
name: frontend
```
```
kubectl create -f fronted-service.yaml
```
```
kubectl get services
```
我們將會在將來的章節討論NortPort。
# 8、訪問Guestbook 前端
當所有的控制器和servies定義好,K8s將會把他們作為pod啟動。一個pod可以根據正在發生的動作有不同的狀態。例如,如果Docker鏡像正在下載,pod將會是pending狀態,因此它不能啟動。一旦準備好,它的狀態將會轉變為運行中。
## 查看Pod狀態
你可以查看相應的狀態,使用下面的命令:
```
kubectl get pods
```
## 查看 NortPort
如果你沒有分配一個都知道的NortPort,K8s會隨機分配一個可用的端口。你可以使用kubectl找到這個已分配的NortPort。
```
kubcetl describe service frontend | grep NodePort
```
## 查看UI
一旦pod是運行狀態,你可以通過端口30080查看UI。訪問:
[https://2886795308-30080-cykoria08.environments.katacoda.com](https://2886795308-30080-cykoria08.environments.katacoda.com/)
在背后,PHP服務通過DNS發現了Redis實例。現在你在K8s上部署了一個多層應用。
- 前言
- 安裝minikube
- 啟動一個單節點的Kubernetes集群
- 啟動一個多節點的集群使用kubeadm
- 使用kubectl部署容器
- 使用YAML部署容器
- 在K8s上部署Guestbook(留言簿)示例
- K8s網絡介紹
- 創建Ingress路由
- Liveness(存活探針)、Readiness(就緒探針)和健康檢查
- 使用CRI-O和kubeadm開始
- 在K8s上運行一個有狀態服務
- 管理K8s中的秘鑰和密碼
- 使用Kompose部署Docker Compose文件
- 在Kubernates上從源代碼部署一個服務
- 使用Heptio Velero備份和恢復
- Helm包管理器
- 基本的K8s的可觀察性(監控)
- 使用EFK記錄日志
- 在K8s上安裝Weave Scope