作者 |?平名 阿里服务端开发技术专家
导读:容器服务 Kubernetes 是目前炙手可热的云原生基础设施,作者过去一年上线了一个用户数极速增长的应用:该应用一个月内日活用户从零至四千万,用户数从零到一亿的裂变式增长,充分享受了容器服务快速简便的扩容操作和高可用特性。作者使用容器服务 Kubernetes 集群将公司内系统完全上云 1 年多,本篇文章记录了其中的踩坑与优化记录。
关注“阿里巴巴云原生”公众号,回复关键词“资料”,即可获得 2019 全年meetup 活动 PPT 合集及 K8s 最全知识图谱。
创建集群时,做好规划,选择优化好的集群配置,可以大大减少后期运维工作,其中部分集群的配置在建立后再也没法修改或者修改极其麻烦。
? ? ? ? ? ? Terway 是阿里云容器服务自研的网络插件,功能上完全兼容 Flannel,如果保守,还是使用 Flannel??
默认 16 的大网段,有效的网段或者其子网 10.0.0.0/8,172.16-31.0.0/12-16,192.168.0.0/16
注: K8s 每次安全漏洞几乎都与 ApiServer 有关,对于线上 K8s 集群,要及时升级补丁,或者不开放公网 apiserver,使用严格的安全组和访问控制。
?
? ?为了高可用,一般使用 3 节点,Master 选择规则如下:
master 机器的存储建议高性能的 50-100G SSD,因为会运行 ETCD,操作系统占用不超过 8G。
建立集群时设置:
集群配置修改:
使用无状态部署 Deployment,参考这篇文章实现分批发布。 优化设置模板:?
apiVersion: apps/v1beta2kind: Deploymentmetadata: annotations: deployment.kubernetes.io/revision: '34'# 标签,映射 service labels: app: {app_name}-aone name: {app_name}-aone-1 namespace: {app_name}spec: progressDeadlineSeconds: 600 replicas: 1 revisionHistoryLimit: 10 selector: matchLabels: app: {app_name}-aone# 批量重启更新策略 strategy: rollingUpdate: maxSurge: 25% maxUnavailable: 25% type: RollingUpdate template: metadata: labels: app: {app_name}-aone spec: containers: # 环境变量增加时区 - env: - name: TZ value: Asia/Shanghai - image: >- registry-vpc.cn-north-2-gov-1.aliyuncs.com/{namespace}/{app_name}:20190820190005 imagePullPolicy: Always # 启动前执行优雅下线摘除 服务注册 lifecycle: preStop: exec: command: - sudo - '-u' - admin - /home/{user_name}/{app_name}/bin/appctl.sh - {app_name} - stop # 存活检查,强烈建议设置 livenessProbe: failureThreshold: 10 initialDelaySeconds: 30 periodSeconds: 10 successThreshold: 1 tcpSocket: port: 5900 timeoutSeconds: 1 name: {app_name}-aone # 就绪检查,强烈建议设置 readinessProbe: failureThreshold: 10 initialDelaySeconds: 30 periodSeconds: 10 successThreshold: 1 tcpSocket: port: 5900 timeoutSeconds: 1 # 资源限制,这个一定要合理设置 resources: limits: cpu: '4' memory: 8Gi requests: cpu: '4' memory: 8Gi terminationMessagePath: /dev/termination-log terminationMessagePolicy: File # 日志存放目录,映射到节点的/var/lib/docker/logs 数据盘,应用日志目录设置到/home/{user_name}/logs 下 volumeMounts: - mountPath: /home/{user_name}/logs name: volume-1553755418538 dnsPolicy: ClusterFirst ## 私有镜像仓库的密钥,从保密字段获取 imagePullSecrets: - name: {app_name}-987 restartPolicy: Always schedulerName: default-scheduler securityContext: {} terminationGracePeriodSeconds: 30 # 日志存放目录,映射到节点的/var/lib/docker/logs 数据盘 volumes: - hostPath: path: /var/lib/docker/logs/{app_name} type: '' name: volume-1553755418538
apiVersion: apps/v1beta2
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: '34'
# 标签,映射 service
labels:
app: {app_name}-aone
name: {app_name}-aone-1
namespace: {app_name}
spec:
progressDeadlineSeconds: 600
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
# 批量重启更新策略
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
containers:
# 环境变量增加时区
- env:
- name: TZ
value: Asia/Shanghai
- image: >-
registry-vpc.cn-north-2-gov-1.aliyuncs.com/{namespace}/{app_name}:20190820190005
imagePullPolicy: Always
# 启动前执行优雅下线摘除 服务注册
lifecycle:
preStop:
exec:
command:
- sudo
- '-u'
- admin
- /home/{user_name}/{app_name}/bin/appctl.sh
- {app_name}
- stop
# 存活检查,强烈建议设置
livenessProbe:
failureThreshold: 10
initialDelaySeconds: 30
periodSeconds: 10
successThreshold: 1
tcpSocket:
port: 5900
timeoutSeconds: 1
name: {app_name}-aone
# 就绪检查,强烈建议设置
readinessProbe:
# 资源限制,这个一定要合理设置
resources:
limits:
cpu: '4'
memory: 8Gi
requests:
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
# 日志存放目录,映射到节点的/var/lib/docker/logs 数据盘,应用日志目录设置到/home/{user_name}/logs 下
volumeMounts:
- mountPath: /home/{user_name}/logs
name: volume-1553755418538
dnsPolicy: ClusterFirst
## 私有镜像仓库的密钥,从保密字段获取
imagePullSecrets:
- name: {app_name}-987
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
# 日志存放目录,映射到节点的/var/lib/docker/logs 数据盘
volumes:
- hostPath:
path: /var/lib/docker/logs/{app_name}
type: ''
因为容器服务的 Cloud Controller Manager 会同步删除 service 建立关联的 SLB,为了防止 service 配置修改误删除 slb 故障,并导致域名、安全等配置需要修改的坑,强烈建议 service 与 slb 解耦,service 采用 NodePort 的方式,slb 另外建立后端服务器指向集群节点,如果需要透传真实 IP,并考虑负载均衡,需要遵守一定的配置规则和方法,参考这个文章。
NodePort:
apiVersion: v1kind: Servicemetadata: name: {app_name} namespace: {namespaces}spec: clusterIP: 10.1.50.65## 策略关系到是否透传真实 IP externalTrafficPolicy: Cluster ports: - name: {app_name}-80-7001 nodePort: 32653 port: 80 protocol: TCP targetPort: 7001 - name: {app_name}-5908-5908 nodePort: 30835 port: 5108 protocol: TCP targetPort: 5108 selector: app: {app_name} sessionAffinity: None type: NodePortstatus: loadBalancer: {}
apiVersion: v1
kind: Service
name: {app_name}
namespace: {namespaces}
clusterIP: 10.1.50.65
## 策略关系到是否透传真实 IP
externalTrafficPolicy: Cluster
ports:
- name: {app_name}-80-7001
nodePort: 32653
port: 80
protocol: TCP
targetPort: 7001
- name: {app_name}-5908-5908
nodePort: 30835
port: 5108
targetPort: 5108
app: {app_name}
sessionAffinity: None
type: NodePort
status:
loadBalancer: {}
然后在负载均衡管理页面,选择后端服务器指向集群的 worker 机器,设置端口为以上服务的端口:32653,完成配置,这样在集群 service 修改或者删除重建的时候,slb 不会被集群的 CCM 删除,不会涉及到域名,安全等配置修改。同时,可以设置一些策略,需要升级修改服务配置时,分批切流等。
阿里云容器服务控制台虽然是云上新产品,提供了极其简单的一键部署功能,以及简便的控制台管理。过去一年中,笔者一路见识阿里云容器服务控制台从简陋向强大的转变过程,虽然多次踩坑,但阿里云容器服务同学认真负责和极好的服务态度让人佩服。
容器服务管理控制台还需要更多的考虑实际运维需求,并紧密结合已有的云产品,比如云效、EDAS、云监控、日志服务等,以应用为单位,提供更好服务。
扫描下方二维码添加小助手,与 8000 位云原生爱好者讨论技术趋势,实战进阶! 进群暗号:公司-岗位-城市
原文链接:http://www.cnblogs.com/alisystemsoftware/p/11454755.html
本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728