中文版:https://kubernetes.io/zh/node
一旦搭建好Kubernetes環境後,後續對於應用的部署與運維,使用Kubernetes就很是方便了mysql
Kubernetes的安裝先不講了git
下面的幾個yaml文件在github
https://github.com/nbcoolkid/learning/tree/master/k8sweb
apiVersion: v1 # 表名這是一個副本集 kind: ReplicationController metadata: # RC的名稱,全局惟一 name: mysql spec: # 期待的Pod數量 replicas: 1 selector: app: mysql # 根據此模板建立Pod副本 template: metadata: labels: # Pod副本擁有的標籤,對應RC的Selector app: mysql spec: containers: - name: mysql image: registry.cn-hangzhou.aliyuncs.com/sherry/mysql:5.7 ports: # 容器應用監聽的端口號 - containerPort: 3306 # 注入容器內的環境變量 env: - name: MYSQL_ROOT_PASSWORD value: "123456"
注意這裏的yaml文件,不能夠有製表符,咱們一概使用空格鍵代替redis
編寫完文件後,使用apply命令作個文件格式檢查sql
➜ k8s git:(master) ✗ kubectl apply -f mysql-rc.yaml replicationcontroller/mysql created
➜ k8s git:(master) ✗ kubectl create -f mysql-rc.yaml replicationcontroller/mysql created
➜ k8s git:(master) ✗ kubectl get rc NAME DESIRED CURRENT READY AGE mysql 1 1 1 4m17s
➜ k8s git:(master) ✗ kubectl get pods NAME READY STATUS RESTARTS AGE mysql-wg9sp 1/1 Running 0 5m16s
其實經過dashboard,也能看到啓動狀況docker
apiVersion: v1 kind: Service # 表名這是一個Kubernetes Service metadata: name: mysql # Service全局名稱 spec: ports: - port: 3306 # Service對外提供的端口 selector: app: mysql # Service對應的Pod擁有此標籤,全部擁有此標籤的pod都歸我管
➜ k8s git:(master) ✗ kubectl create -f mysql-svc.yaml service/mysql created
➜ k8s git:(master) ✗ kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 175m mysql ClusterIP 10.105.55.185 <none> 3306/TCP 84s
能夠發現,MySQL服務被分配了一個值爲10.105.55.185
的CLUSTER-IP
,端口爲3306api
此時,Kubernetes集羣中其餘建立的Pod就能夠經過這個ip+端口進行鏈接和訪問了
這裏的ip,是Service建立後由Kubernetes系統自動分配的,
其餘Pod沒法餘弦知道,因此須要有一個服務發現機制來找到這個服務。
如今,咱們根據Service的惟一名稱獲取到ip和端口
apiVersion: v1 kind: ReplicationController metadata: name: myweb spec: replicas: 2 selector: app: myweb template: metadata: labels: app: myweb spec: containers: - name: myweb image: kubeguide/tomcat-app:v1 ports: - containerPort: 8080
在Tomcat容器內部,應用將使用環境變量MYSQL_SERVICE_HOST的值鏈接MySQL,更安全的作法是使用服務的名稱mysql進行訪問
➜ k8s git:(master) ✗ kubectl create -f myweb-rc.yaml replicationcontroller/myweb created
➜ k8s git:(master) ✗ kubectl get pods NAME READY STATUS RESTARTS AGE mysql-ck4j5 1/1 Running 0 164m myweb-8dhr9 1/1 Running 0 3m11s myweb-nm75w 1/1 Running 0 3m11s
apiVersion: v1 kind: Service metadata: name: myweb spec: type: NodePort ports: - port: 8080 nodePort: 30001 selector: app: myweb
type: NodePort
和nodePort: 30001
,代表此Service開啓了NodePort
方式的外網訪問模式
➜ k8s git:(master) ✗ kubectl create -f myweb-svc.yaml service/myweb created
➜ k8s git:(master) ✗ kubectl get service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5h47m mysql ClusterIP 10.105.55.185 <none> 3306/TCP 174m myweb NodePort 10.101.31.133 <none> 8080:30001/TCP 41s
通過上述步驟,咱們經過dashbaord查看到底啓動了哪些服務
咱們可使用 http://虛擬機ip:30001/demo/
的方式來進行驗證訪問
那麼怎麼獲取這個虛擬機的ip呢?
我這裏使用的是minikube安裝的Kubernetes環境,安裝後,在虛擬機中的Linux,帳號是root,密碼爲空
而後使用ipconfig|more
命令就能看到ip
ok,至此,咱們的hello world完畢
Kubernetes中的大部分概念,包括Node、Pod、Replication Controller、Service,均可以被看作一種資源對象
幾乎全部的資源對象均可以經過kubectl進行增刪改查操做,並持久化到etcd中
聲明當前這個資源對象歸屬於v1這個核心API
大部分的資源對象都歸屬於v1這個核心API
Kubernetes集羣的控制節點,通常在生產環境至少部署3臺做爲高可用
全部的Kubernetes指令都是發給Master,由Master去管理集羣中的節點
Pod運行在Node上
Pod有一個Pause根容器
Pod內容器能夠和Kubernetes集羣中任意的Pod內的容器進行直接通訊
PodIP+容器端口=Endpoint,表明此Pod內的某個服務的對外通訊地址
能夠配置Pod對資源指望的最低要求和最高要求(CPU、內存)
resources: # 設置一個較小的值,符合容器平時工做負載下的資源需求 requests: # 內存佔用,默認單位爲字節,通常咱們使用Mi,表示兆 memory: "64Mi" # 以1/1000爲最小單位,100m表示0.1個CPU # 不論是在一個1Core的機器仍是8Core的機器上,100m表明的含義都是同樣的 cpu: "250m" # 設置一個較大的值,符合容器峯值負載下的資源需求 # 當容器試圖使用超過這個量的資源時,可能被Kubernetes殺掉並重啓 limits: memory: "128Mi" cpu: "500m"
,
分割AND
關係
確保擁有tier=frontend
標籤的Pod在Kubernetes集羣中始終只有一個副本
爲了更好的解決Pod的編排問題,Deployment內部使用Replica Set
咱們把Deployment當作一次RC的升級便可
HPA用於實現Pod的橫向自動擴容
Kubernetes內部的服務,最終是經過Service暴露出去的
Service整個生命週期內,擁有惟一不變的ip
命名空間,通常用於實現多租戶的資源個例
本文由博客一文多發平臺 OpenWrite 發佈!