Pod 实现机制
Pod 為了親密性應(yīng)用而存在:
- 兩個(gè)應(yīng)用需要通過 127.0.0.1 或者 Socket 通信;
- 兩個(gè)應(yīng)用之間發(fā)生文件交互;
- 兩個(gè)應(yīng)用發(fā)生頻繁的調(diào)用
共享網(wǎng)絡(luò)
Pod 中的所有容器擁有同一個(gè) IP 地址:
# 生成 Pod 的 YAML 文件
[root@k8s-master01 ~]# cat pod.yaml
apiVersion: v1
kind: Pod
metadata:
labels:
app: my-podz
name: my-podz
namespace: default
spec:
containers:
- name: nginx-demoz
image: nginx:1.8
- name: java-demoz
image: www.myharbor.com/wangqihan/java-demo:v1
# 創(chuàng)建 Pod
[root@k8s-master01 ~]# kubectl apply -f pod.yaml
[root@k8s-master01 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
my-podz 2/2 Running 0 11s
# 進(jìn)入 java-demoz 查看 IP 地址
[root@k8s-master01 ~]# kubectl exec -it my-podz -c java-demoz bash
root@my-podz:/usr/local/tomcat# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
3: eth0@if22: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group default
link/ether ce:67:02:aa:10:c2 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 10.244.1.15/24 brd 10.244.1.255 scope global eth0
valid_lft forever preferred_lft forever
root@my-podz:/usr/local/tomcat# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 14 01:31 ? 00:00:24 /usr/local/openjdk-8/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging
root 40 0 0 01:33 pts/0 00:00:00 bash
root 46 40 0 01:34 pts/0 00:00:00 ps -ef
# 進(jìn)入 nginx-demoz 查看 IP 地址
[root@k8s-master01 ~]# kubectl exec -it my-podz -c nginx-demoz bash
root@my-podz:/# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
3: eth0@if22: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group default
link/ether ce:67:02:aa:10:c2 brd ff:ff:ff:ff:ff:ff
inet 10.244.1.15/24 brd 10.244.1.255 scope global eth0
valid_lft forever preferred_lft forever
root@my-podz:/# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 01:31 ? 00:00:00 nginx: master process nginx -g daemon off;
nginx 6 1 0 01:31 ? 00:00:00 nginx: worker process
root 7 0 0 01:34 pts/0 00:00:00 bash
root 13 7 0 01:34 pts/0 00:00:00 ps -ef
共享存儲
為了持久化保存容器的數(shù)據(jù),可以使用 Kubernetes Volume
Volume 存儲卷 是 Pod 中能夠被多個(gè)容器訪問的共享目錄,Kubernetes 的 Volume 概念,用途和目的與 Docker 的 Volume 類似,但兩者不能等價(jià):
- 首先,Kubernetes 中的 Volume 定義在 Pod 上,被一個(gè) Pod 里的多個(gè)容器掛在到具體的文件目錄下;
- 其次,Kubernetes 中的 Volume 與 Pod 生命周期相同,但與 Docker 容器生命周期不相關(guān),容器終止或者重啟時(shí),Volume 中的數(shù)據(jù)也不會丟失;
- 最后,Kubernetes 中的 Volume 支持多種 backend 類型,包括 emptyDir、hostPath、GCE Persistent Disk、AWS Elastic Block Store、NFS、Ceph 等。
[root@k8s-master01 ~]# vim mypodzz.yaml
apiVersion: v1
kind: Pod
metadata:
name: my-podzz
namespace: default
spec:
containers:
- name: producer
image: centos:7
command: ["bash","-c","for i in {1..100};do echo $i >> /producer_dir/hello;sleep 1;done"]
volumeMounts:
- name: shared-volume
mountPath: /producer_dir
- name: consumer
image: centos:7
command: ["bash","-c","tail -f /consumer_dir/hello"]
volumeMounts:
- name: shared-volume
mountPath: /consumer_dir
volumes:
- name: shared-volume
emptyDir: {}
# 創(chuàng)建 Pod 資源
[root@k8s-master01 ~]# kubectl apply -f podzz.yaml
# 檢查 Pod 資源狀態(tài)
[root@k8s-master01 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
my-podzz 2/2 Running 0 20s
# 查看 comsumer 容器內(nèi)掛載目錄
[root@k8s-master01 ~]# kubectl exec -it my-podzz -c consumer bash
[root@my-podzz /]# cat /consumer_dir/hello
1
2
3
...
# 查看 producer 容器內(nèi)掛載目錄
[root@k8s-master01 ~]# kubectl exec -it my-podzz -c producer bash
[root@my-podzz /]# cat /producer_dir/hello
1
2
3
...
# 查看 Pod 資源詳細(xì)信息,可以看到被分配到 k8s-node2 節(jié)點(diǎn)
[root@k8s-master01 ~]# kubectl describe pod my-podzz | tail -4
Name: my-podzz
Namespace: default
Priority: 0
Node: k8s-node2/172.16.1.54
# 到 Node 節(jié)點(diǎn)上觀察 Docker 容器
[root@k8s-node02 data]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
633ac7b61c12 7e6257c9f8d8 "bash -c 'for i in {…" About a minute ago Up About a minute k8s_producer_my-podzz_default_e1a6acc0-4903-4599-a922-4c1beb6a7b56_4
36f4c5957b51 7e6257c9f8d8 "bash -c 'tail -f /c…" 9 minutes ago Up 9 minutes k8s_consumer_my-podzz_default_e1a6acc0-4903-4599-a922-4c1beb6a7b56_0
# 觀察掛載目錄
[root@k8s-node02 data]# docker inspect 633ac7b61c12 | grep -i source
[root@k8s-node02 data]# docker inspect 36f4c5957b51 | grep -i source
總結(jié)
- 上一篇: Scala的几个小tips
- 下一篇: 【转载】表单验证<AngularJ