Kubernetes教程之應用部署
前言
本文將與讀者一起, 學習如何在Kubernetes上部署應用. 包括: 如何部署應用、釋出檔案講解、將本地專案打包釋出等.
閱讀這篇文章你能收穫到:
- 學會如何在k8s部署應用
- 如何打包Docker映象、上傳到私有庫
閱讀本文你需要:
- 熟悉Linux命令.
- 有一個Kubernetes環境 (可參考《跟著官方文件從零搭建K8S》在本地部署一套Kubernetes測試環境)
理解描述檔案
首先, 我們通過在Kubernetes部署Nginx來理解描述檔案.
一般地, Kubernetes使用yaml(或json)來描述釋出配置. 下面是一個簡單的描述檔案: nginx-pod.yaml
apiVersion: v1 # 描述檔案所遵循KubernetesAPI的版本
kind: Pod # 描述的型別是pod
metadata:
name: nginx-pod # pod的名稱
labels: # 標籤
app: nginx-pod
env: test
spec:
containers:
- name: nginx-pod # 容器名
image: nginx:1.15 # 映象名稱及版本
imagePullPolicy: IfNotPresent # 如果本地不存在就去遠端倉庫拉取
ports:
- containerPort: 80 # pod對外埠
restartPolicy: Always
複製程式碼
我們登入Master節點, 使用kubectl
命令來部署這個檔案所描述的應用. (當然, 使用dashboard釋出也可)
kubectl get pods
命令是用來檢視pod列表的, 使用grep
篩選出nginx相關的pod. 此時nginx已經發布完成了. 我們可以從dashboard來直觀地檢視到應用狀態.
備註: 刪除pod可使用
kubectl delete -f nginx-pod.yaml
命令, 也可直接在dashboard進行操作.
本文釋出於樸瑞卿的部落格, 允許非商業用途轉載, 但轉載必須保留原作者樸瑞卿 及連結:blog.piaoruiqing.com. 如有授權方面的協商或合作, 請聯絡郵箱: piaoruiqing@gmail.com.
如何訪問服務
上一小節我們部署了一個Nginx pod, 但我們無法訪問到該Nginx.
想要訪問到pod中的服務, 最簡單的方式就是通過埠轉發, 執行如下命令, 將宿主機的9999
埠與nginx-pod的80
埠繫結:
[root@nas-centos1 ~]$ kubectl port-forward --address 0.0.0.0 nginx-pod 9999:80
Forwarding from 0.0.0.0:9999 -> 80
Handling connection for 9999
複製程式碼
此時, 我們可以通過訪問宿主機9999埠來訪問Nginx.
部署本地專案
將本地開發的專案釋出到Kubernetes, 需要將專案打包成Docker映象, 然後將映象推送到倉庫(公開/私有倉庫都可).
首先, 我們需要一個可以執行的本地專案, 筆者使用spring-boot構建了一個簡單的web專案:
@RestController
@RequestMapping(value = "/k8s-test")
@SpringBootApplication
public class K8sTestApplication {
@GetMapping(value = "/timestamp")
public ResponseEntity<?> getTimestamp() {
return ResponseEntity.ok(System.currentTimeMillis() + "\n");
}
public static void main(String[] args) {
SpringApplication.run(K8sTestApplication.class, args);
}
}
複製程式碼
打包Docker映象
有了專案, 我們需要將其打包成一個Docker映象, Dockerfile
內容如下:
FROM java:8-alpine
COPY ./k8s-test-0.0.1-SNAPSHOT.jar /usr/app/
WORKDIR /usr/app
ENTRYPOINT ["java", "-jar", "k8s-test-0.0.1-SNAPSHOT.jar"]
複製程式碼
FROM java:8-alpine
: 該映象基於java-8-alpine
映象.COPY ./target/k8s-test-0.0.1-SNAPSHOT.jar /usr/app/
: 將編譯打包好的jar拷貝到映象的/usr/app
目錄下.WORKDIR /usr/app
: 工作目錄指定為/usr/app
.ENTRYPOINT ["java", "-jar", "k8s-test-0.0.1-SNAPSHOT.jar"]
: 啟動docker時執行java -jar k8s-test-0.0.1-SNAPSHOT.jar
命令
進入到Dockerfile所在目錄執行docker build -t piaoruiqing/k8s-test .
進行打包. 注意不要遺漏掉命令最後面的.
, 它代表當前目錄.
[root@nas-centos1 k8s-test]$ docker build -t piaoruiqing/k8s-test .
複製程式碼
通過docker images
命令可以檢視本地映象列表:
[root@nas-centos1 k8s-test]$ docker images | grep k8s
piaoruiqing/k8s-test latest efe9e9625376 4 minutes ago 174MB
複製程式碼
推送到遠端倉庫
docker映象打包完成後, 需要推送到映象倉庫供Kubernetes各個節點使用. 本文以阿里雲的容器映象服務為例.
首先, 登入到阿里雲控制檯 -> 容器映象服務, 建立一個名稱空間:
# 登入, 用於登入的使用者名稱為阿里雲賬號全名, 密碼為開通服務時設定的密碼.
[root@nas-centos1 k8s-test]$ docker login --username=[使用者名稱] registry.cn-hangzhou.aliyuncs.com
# 打標籤, 映象ID可以通過 docker images 命令檢視
[root@nas-centos1 k8s-test]$ docker tag efe9e9625376 registry.cn-hangzhou.aliyuncs.com/piaoruiqing/k8s-test:0.0.1
# 推送到阿里雲映象倉庫
[root@nas-centos1 k8s-test]$ docker push registry.cn-hangzhou.aliyuncs.com/piaoruiqing/k8s-test:0.0.1
複製程式碼
部署
私庫支援
由於筆者使用了私庫, Kubernetes無法直接訪問, 釋出前需要先建立secret 以支援私有庫的訪問.
kubectl create secret docker-registry docker-registry-secret --docker-server=registry.cn-hangzhou.aliyuncs.com --docker-username=[使用者名稱] --docker-password=[密碼] --docker-email=[郵箱]
複製程式碼
docker-registry-secret
: 指定金鑰的鍵名稱, 可自行定義.docker-server
: 指定 Docker 倉庫地址.docker-username
: 指定 Docker 倉庫使用者名稱.docker-password
: 指定 Docker 倉庫登入密碼.docker-email
: 指定郵件地址(選填).
可通過kubectl get secrets
檢視全部secret
[root@nas-centos1 k8s-test]$ kubectl get secrets
NAME TYPE DATA AGE
default-token-s7bps kubernetes.io/service-account-token 3 13d
docker-registry-secret kubernetes.io/dockerconfigjson 1 2m50s
複製程式碼
開始部署
訪問私庫時, 描述檔案中需要指定secret, 如下:
apiVersion: v1
kind: Pod
metadata:
name: k8s-test-pod
labels:
app: k8s-test-pod
spec:
containers:
- name: k8s-test-pod
image: registry.cn-hangzhou.aliyuncs.com/piaoruiqing/k8s-test:0.0.1
imagePullPolicy: IfNotPresent
restartPolicy: Always
imagePullSecrets:
- name: docker-registry-secret # 這裡就是前文中建立的secret, 用來訪問私庫
複製程式碼
執行命令kubectl apply -f k8s-test-pod.yaml
進行部署, 完成後我們可以在dashboard檢視.
使用kubectl port-forward --address 0.0.0.0 k8s-test-pod 80:8080
可繫結主機(master) 80埠和pod的8080埠. 如此我們就可以訪問 http://10.33.30.95/k8s-test/timestamp了.
[root@nas-centos2 ~]$ curl 10.33.30.95/k8s-test/timestamp
1569512136028
複製程式碼
部署叢集
現在, 我們已經成功地在Kubernetes上部署了一個應用例項, 生產環境中多數情況下我們的應用需要叢集部署, 此時, 我們使用 Deployment 來描述即可:
apiVersion: apps/v1
kind: Deployment
metadata:
name: k8s-test
labels:
app: k8s-test
spec:
replicas: 3 # 副本數量
template:
metadata:
name: k8s-test
labels:
app: k8s-test
env: test
spec:
containers:
- name: k8s-test
image: registry.cn-hangzhou.aliyuncs.com/piaoruiqing/k8s-test:0.0.1
imagePullPolicy: IfNotPresent
ports:
- name: http-port
containerPort: 8080
imagePullSecrets:
- name: docker-registry-secret
restartPolicy: Always
selector:
matchLabels:
app: k8s-test
複製程式碼
同樣地, 使用kubectl apply -f
命令釋出配置即可.
[root@nas-centos1 k8s-test]$ kubectl apply -f k8s-test.yaml
deployment.apps/k8s-test created
複製程式碼
如果這篇文章對您有幫助,請點個贊吧 ( ̄▽ ̄)"
參考文獻
系列文章
歡迎關注公眾號(程式碼如詩):
本文釋出於樸瑞卿的部落格, 允許非商業用途轉載, 但轉載必須保留原作者樸瑞卿 及連結:blog.piaoruiqing.com. 如有授權方面的協商或合作, 請聯絡郵箱: piaoruiqing@gmail.com.