MySQL實例
定義描述文件
apiVersion: v1
kind: ReplicationController #副本控制器RC
metadata:
name: mysql #RC的名稱,全局唯一
spec:
replicas: 2 #Pod副本的期待數量
selector:
app: mysql #符合目標的Pod擁有此標籤
template: #根據此模板創建Pod的副本(實例)
metadata:
labels:
app: mysql #Pod副本擁有的標籤,對應RC的Selector
spec:
containers: #Pod內容器的定義部分
- name: mysql #容器的名稱
image: hub.c.163.com/library/mysql #容器對應的Docker image
ports:
- containerPort: 3306 #容器應用監聽的端口號
env: #注入容器內的環境變量
- name: MYSQL_ROOT_PASSWORD
value: "123456"
創建RC
創建mysql-rc.yaml完成後,在master節點使用kubectl命令發佈到K8S集羣中
kubectl create -f mysql-re.yaml
查看啓動狀態
通過查看當前的pods列表,是否已經啓動成功
NAME READY STATUS RESTARTS AGE
mysql-s952r 1/1 Running 1 22h
mysql-zlmwg 1/1 Running 1 22h
網絡異常解決方案(未出現問題可以跳過,你懂我的意思把)
出現了ContainerCreating狀態,並且長時間沒有創建成功
通過kubectl describe pods mysql
查看pods詳細狀態
Name: mysql-tscrh
Namespace: default
Priority: 0
PriorityClassName: <none>
Node: node1/192.168.236.178
Start Time: Mon, 17 Jun 2019 09:10:35 +0000
Labels: app=mysql
Annotations: <none>
Status: Pending
IP:
Controlled By: ReplicationController/mysql
Containers:
mysql:
Container ID:
Image: hub.c.163.com/library/mysql
Image ID:
Port: 3306/TCP
Host Port: 0/TCP
State: Waiting
Reason: ContainerCreating
Ready: False
Restart Count: 0
Environment:
MYSQL_ROOT_PASSWORD: 123456
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-q6ggq (ro)
Conditions:
Type Status
Initialized True
Ready False
ContainersReady False
PodScheduled True
Volumes:
default-token-q6ggq:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-q6ggq
Optional: false
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s
node.kubernetes.io/unreachable:NoExecute for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 22m default-scheduler Successfully assigned default/mysql-tscrh to node1
Warning FailedCreatePodSandBox 22m kubelet, node1 Failed create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container "58d143373e767c40610587624c667d8e20dd77fa397952406a085f2ae1dc38e6" network for pod "mysql-tscrh": NetworkPlugin cni failed to set up pod "mysql-tscrh_default" network: open /run/flannel/subnet.env: no such file or directory
Warning FailedCreatePodSandBox 22m kubelet, node1 Failed create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container "81d12726dbe075c64af48142638e98863231e8201ccc292f0dda1fccfa7fdaec" network for pod "mysql-tscrh": NetworkPlugin cni failed to set up pod "mysql-tscrh_default" network: open /run/flannel/subnet.env: no such file or directory
Warning FailedCreatePodSandBox 22m kubelet, node1 Failed create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container "8bd77ee0176d369435ead7bd3c2675b7bbcbdc2b052cf34c784f04053a7d5288" network for pod "mysql-tscrh": NetworkPlugin cni failed to set up pod "mysql-tscrh_default" network: open /run/flannel/subnet.env: no such file or directory
Warning FailedCreatePodSandBox 22m kubelet, node1 Failed create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container "0733fc209e085e96f5823a2280b012a609dace41fda967c5ae951005a8699ce6" network for pod "mysql-tscrh": NetworkPlugin cni failed to set up pod "mysql-tscrh_default" network: open /run/flannel/subnet.env: no such file or directory
Warning FailedCreatePodSandBox 22m kubelet, node1 Failed create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container "91f337eb334612b2e7426d820ba4b15a9c9c549050517d459508832b69780b5f" network for pod "mysql-tscrh": NetworkPlugin cni failed to set up pod "mysql-tscrh_default" network: open /run/flannel/subnet.env: no such file or directory
Warning FailedCreatePodSandBox 22m kubelet, node1 Failed create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container "48cbba9896068a774d9128a6864394e8726a0d857bae61036421ad73f5d6e3dd" network for pod "mysql-tscrh": NetworkPlugin cni failed to set up pod "mysql-tscrh_default" network: open /run/flannel/subnet.env: no such file or directory
Warning FailedCreatePodSandBox 22m kubelet, node1 Failed create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container "d259778aa19418a9a429b3175b66afae3d8ffb7324ec9df492b2947dbc153460" network for pod "mysql-tscrh": NetworkPlugin cni failed to set up pod "mysql-tscrh_default" network: open /run/flannel/subnet.env: no such file or directory
Warning FailedCreatePodSandBox 22m kubelet, node1 Failed create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container "3d01c00ac9eaac7b2e983402be38c1cf60c4bbd1d454aa45329ce0ca0c2bf792" network for pod "mysql-tscrh": NetworkPlugin cni failed to set up pod "mysql-tscrh_default" network: open /run/flannel/subnet.env: no such file or directory
Warning FailedCreatePodSandBox 22m kubelet, node1 Failed create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container "98879cbb0405dac3a24753dd1986070a53fe9ee9f1b819996a903c19286a2bb7" network for pod "mysql-tscrh": NetworkPlugin cni failed to set up pod "mysql-tscrh_default" network: open /run/flannel/subnet.env: no such file or directory
Warning FailedCreatePodSandBox 7m49s (x838 over 22m) kubelet, node1 (combined from similar events): Failed create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container "60923335b41c2d0412b279bdb6150f9b9b7eae20c4a02549e35509083c01384b" network for pod "mysql-tscrh": NetworkPlugin cni failed to set up pod "mysql-tscrh_default" network: open /run/flannel/subnet.env: no such file or directory
Normal SandboxChanged 2m49s (x1127 over 22m) kubelet, node1 Pod sandbox changed, it will be killed and re-created.
根據報錯信息可以判斷出是flannel網絡插件的問題
解決辦法:配置flannel網絡
分別在三臺服務器上執行如下步驟
-
創建目錄
sudo mkdir -p /run/flannel
-
創建環境描述文件
$ sudo tee /run/flannel/subnet.env <<-'EOF' FLANNEL_NETWORK=10.244.0.0/16 FLANNEL_SUBNET=10.244.0.1/24 FLANNEL_MTU=1450 FLANNEL_IPMASQ=true EOF
在此運行就沒有報錯了
tomcat實例
定義描述文件
apiVersion: v1
kind: ReplicationController
metadata:
name: myweb
spec:
replicas: 5 #Pod副本期待數量爲5
selector:
app: myweb
template:
metadata:
labels:
app: myweb
spec:
containers:
- name: myweb
image: docker.io/kubeguide/tomcat-app:v1
ports:
- containerPort: 8080
env:
- name: MYSQL_SERVICE_HOST
value: "mysql"
- name: MYSQL_SERVICE_PORT
value: "3306"
加載RC副本描述文件
$ kubectl create -f myweb-rc.yaml
replicationcontroller/myweb created
$ kubectl get rc
NAME DESIRED CURRENT READY AGE
mysql 1 1 0 4m22s
myweb 5 5 0 7s
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
mysql-tp69s 1/1 Running 0 21s
myweb-266mz 0/1 ContainerCreating 0 2s
myweb-j7nl7 0/1 ContainerCreating 0 2s
myweb-s7drm 0/1 ContainerCreating 0 2s
myweb-sq4ns 0/1 ContainerCreating 0 2s
myweb-t4vlf 0/1 ContainerCreating 0 2s
$
注意mysql實例 狀態 Running
myweb實例狀態 ContainerCreating
過幾分鐘myweb實例狀態變成 Running
創建服務副本
在master服務器
- 使用root用戶登錄,並切換到working目錄
cd /root/working
- 創建描述服務描述文件
myweb-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: myweb
spec:
type: NodePort
ports:
- port: 8080
nodePort: 30001
selector:
app: myweb
部署服務
$kubectl create -f myweb-svc.yaml
驗證
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
mysql-tp69s 1/1 Running 0 15m
myweb-266mz 1/1 Running 0 14m
myweb-j7nl7 1/1 Running 0 14m
myweb-s7drm 1/1 Running 0 14m
myweb-sq4ns 1/1 Running 0 14m
myweb-t4vlf 1/1 Running 0 14m
itcast@master:~/working$ kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 19h
myweb NodePort 10.109.234.197 <none> 8080:30001/TCP 25m
已經看到已經有一個myweb
服務已經啓動
itcast@master:~/working$ kubectl describe service myweb
Name: myweb
Namespace: default
Labels: <none>
Annotations: <none>
Selector: app=myweb
Type: NodePort
IP: 10.109.234.197
Port: <unset> 8080/TCP
TargetPort: 8080/TCP
NodePort: <unset> 30001/TCP
Endpoints: 10.244.0.6:8080,10.244.0.6:8080,10.244.0.7:8080 + 2 more...
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
service詳情這裏的IP就是CLUSTER-IP. CLUSTER-IP是和service綁定的。
service詳情這裏的Port就是Service的端口號。
service詳情這裏的NodePort就是Node的真實端口號。
service詳情這裏的Endpoints就是容器的IP和port。
驗證端口號
$ netstat -tlp|grep 30001
tcp6 0 0 [::]:30001 [::]:* LISTEN 4333/kube-proxy
$
我們可以打開瀏覽器,輸入master/node1/node2任何一個地址家30001端口都可以,訪問tomcat服務。
http://192.168.80.144:30001