Kubernetes 容器设计模式
类型
1.Sidecar
◆Pod中的应用由主应用程序(通常是基于HTTP协议的应用程序)以及一个Sidecar容器组成
◆辅助容器用于为主容器提供辅助服务以增强主容器的功能,是主应用程序是必不可少的一部分,但却未必非得运行为应用的一部分
2.Adapter
◆Pod中的应用由主应用程序和一个Adapter容器组成
◆Adapter容器为主应用程序提供一致的接口,实现了模块重用,支持标准化和规范化主容器应用程序的输出以便于外部服务进行聚合
3.Ambassador
◆Pod中的应用由主应用程序和一个Ambassador容器组成
◆辅助容器代表主容器发送网络请求至外部环境中,因此可以将其视作主容器应用的“大使”
◆应用场景:云原生应用程序需要诸如断路、路由、计量和监视等功能,但更新已有的应用程序或现有代码库以添加这些功能可能很困难,甚至难以实现,进程外代理便成了一种有效的解决方案
4.init_Container
◆一个Pod中可以同时定义多个Init容器
◆Init容器负责以不同于主容器的生命周期来完成那些必要的初始化任务,包括在文件系统上设置必要的特殊权限、
数据库模式设置或为主应用程序提供初始数据等,但这些初始化逻辑无法包含在应用程序的镜像文件中,或者出于安全原因,应用程序镜像没有执行初始化活动的权限等等
◆Init容器需要串行运行,且在所有Init容器均正常终止后,才能运行主容器
1.Sidecar
#类似与 ennoy 作为sidecar容器 代理Pod中的网络 进行对外访问网络策略
apiVersion: v1
kind: Pod
metadata:
name: sidecar-container-demo
namespace: default
spec:
containers:
- name: proxy
image: envoyproxy/envoy-alpine:v1.14.1
- name: demo
image: ikubernetes/demoapp:v1.0
imagePullPolicy: IfNotPresent
env:
- name: HOST
value: "127.0.0.1"
- name: PORT
value: "8080"
2.Adapter
#将 nginx格式转换为 nginx-prometheus-exporter 格式 对接 Prometheus
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-conf
data:
default.conf: |
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location /nginx_status {
stub_status;
allow 127.0.0.1;
deny all;
}
}
---
apiVersion: v1
kind: Pod
metadata:
name: adapter-container-demo
spec:
containers:
- name: nginx
image: nginx:alpine
ports:
- containerPort: 80
volumeMounts:
- mountPath: /etc/nginx/conf.d/
name: nginx-conf
readOnly: true
- name: adapter
image: nginx/nginx-prometheus-exporter:latest
args: ["-nginx.scrape-uri","http://localhost/nginx_status"]
ports:
# nginx-prometheus-exporter默认监听tcp/9113端口
- name: exporter
containerPort: 9113
volumes:
- name: nginx-conf
configMap:
name: nginx-conf
items:
- key: default.conf
path: default.conf
3.Ambassador
#额外添加一个容器 作为代理去 访问外部服务 进行网络访问。
apiVersion: v1
kind: Pod
metadata:
name: ambassador-container-demo
spec:
containers:
- name: curl
image: ikubernetes/admin-box:v1.2
command: ["sleep", "999999"]
- name: ambassador
image: bitnami/kubectl:latest
command: ["/bin/sh","-c","kubectl proxy"]
args:
# 传递给 kubectl proxy 的选项,若需要改变默认监听的tcp/8001端口,可以额外附加“--port=NUM”选项;
- --server="https://kubernetes.default.svc"
- --certificate-authority="/var/run/secrets/kubernetes.io/serviceaccount/ca.crt"
- --token="$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)"
- --accept-paths='^.\*'
4.init_Container
#initContainers 初始化容器 先于业务容器 全部启动成功再启动业务容器 类似于 可以先处理一下预制脚本 ELK中部署初始环境之类
apiVersion: v1
kind: Pod
metadata:
name: init-container-demo
namespace: default
spec:
initContainers:
- name: iptables-init
image: ikubernetes/admin-box:latest
imagePullPolicy: IfNotPresent
command: ['/bin/sh','-c']
args: ['iptables -t nat -A PREROUTING -p tcp --dport 8080 -j REDIRECT --to-port 80']
securityContext:
capabilities:
add:
- NET_ADMIN
containers:
- name: demo
image: ikubernetes/demoapp:v1.0
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80