容器设计模式中的单节点多容器模式支持三种多容器模式:

  • SideCar:为主容器提供辅助功能,如为主容器提供代理服务,为主容器提供数据收集。
  • Adapter:若某个pod内数据输出格式与某个规定的引用接受数据的格式不兼容,用适配器来将其转换以达到兼容的目的。
  • Ambassador:主容器中的引用不方便对外联络,可以专门制作一个容器来实现对外联络的功能。如redis集群联络其他节点可以专门做一个大使来进行联络

SideCar示例

1.编写配置清单

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
root@k8s-master01:~/yaml/chapter04# vim sidecar-container-demo.yaml
apiVersion: v1
kind: Pod
metadata:
name: sidecar-container-demo
namespace: default
spec:
containers:
- name: proxy
image: envoyproxy/envoy-alpine:v1.14.1
command: ['/bin/sh','-c']
args: ['sleep 5 && envoy -c /etc/envoy/envoy.yaml']
lifecycle:
postStart:
exec:
command: ['/bin/sh','-c','wget -O /etc/envoy/envoy.yaml http://ilinux.io/envoy.yaml']
- name: demo
image: ikubernetes/demoapp:v1.0
imagePullPolicy: IfNotPresent
env:
- name: HOST
value: "127.0.0.1"
- name: PORT
value: "8080"

2.应用配置

1
2
3
4
5
6
7
root@k8s-master01:~/yaml/chapter04# kubectl apply -f sidecar-container-demo.yaml
pod/sidecar-container-demo created

root@k8s-master01:~/yaml/chapter04# kubectl get pods sidecar-container-demo -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
sidecar-container-demo 2/2 Running 0 4m10s 10.244.1.25 k8s-node01 <none> <none>
# 容器内存在2个pod,并且都ready。

3.测试访问容器,看envoy是否将流量代理给8080端口

1
2
3
4
5
6
7
8
9
10
11
12
# 测试访问
root@k8s-master01:~/yaml/chapter04# curl 10.244.1.25
iKubernetes demoapp v1.0 !! ClientIP: 127.0.0.1, ServerName: sidecar-container-demo, ServerIP: 10.244.1.25!

# 查看报文头部
root@k8s-master01:~/yaml/chapter04# curl -I 10.244.1.25
HTTP/1.1 200 OK
content-type: text/html; charset=utf-8
content-length: 108
server: envoy #此为envoy的代理
date: Fri, 02 Jul 2021 09:24:45 GMT
x-envoy-upstream-service-time: 1