做包装的网站有哪些,项目建议书,建设一个外贸网站需要多少钱,wordpress 创建表导读#xff1a;容器服务 Kubernetes 是目前炙手可热的云原生基础设施#xff0c;作者过去一年上线了一个用户数极速增长的应用#xff1a;该应用一个月内日活用户从零至四千万#xff0c;用户数从零到一亿的裂变式增长#xff0c;充分享受了容器服务快速简便的扩容操作和… 导读容器服务 Kubernetes 是目前炙手可热的云原生基础设施作者过去一年上线了一个用户数极速增长的应用该应用一个月内日活用户从零至四千万用户数从零到一亿的裂变式增长充分享受了容器服务快速简便的扩容操作和高可用特性。作者使用容器服务 Kubernetes 集群将公司内系统完全上云 1 年多本篇文章记录了其中的踩坑与优化记录。 创建集群
创建集群时做好规划选择优化好的集群配置可以大大减少后期运维工作其中部分集群的配置在建立后再也没法修改或者修改极其麻烦。 集群规划 网络规划 网络类型: Flannel、TerwayTerway 是阿里云容器服务自研的网络插件功能上完全兼容 Flannel如果保守还是使用 Flannel
Pod 网络 CIDR
默认 16 的大网段有效的网段或者其子网 10.0.0.0/8172.16-31.0.0/12-16192.168.0.0/16 Service CIDR 默认 20 的网段可选10.0.0.0/16-24172.16-31.0.0/16-24192.168.0.0/16-24网段不能冲突重复建立后没法修改多个区域的多个交换机。公网访问 ApiServer 对于线上等安全要求高的集群可以选择不暴露 apiserver, 只有私网 SLB, 但是这样没法使用云效发布日常预发等集群可以暴露公网 SLB 到 apiserver, 集群建立后立即为 slb 建立访问控制限制 slb 只能云效访问
注 K8s 每次安全漏洞几乎都与 ApiServer 有关对于线上 K8s 集群要及时升级补丁或者不开放公网 apiserver,使用严格的安全组和访问控制。 安全组 设置安全组限定访问范围为 master 与 worker 机器使用。Master 机器规划为了高可用一般使用 3 节点Master 选择规则如下
节点数 master 规格1-5个4C8G6-20个节点4C16G21-100个节点8C32G100-200个节点16C64G
master 机器的存储建议高性能的 50-100G SSD因为会运行 ETCD操作系统占用不超过 8G。 Worker 机器规划 阿里云首推神龙机器没有神龙机器的区域选用高配 ECS配置规格根据部署的 POD 规格乘以一定倍数比如 Java 应用 pod 一般选择 4C8GECS 则购买 32C64G 或者 64C128G 为好设置部署的时候为 pod 设置固定的 request/limit; 我们选用的机器配置 32C64G ECS存储。系统盘100G SSD, 数据盘400G 高效云盘操作系统centos 7.4 64 位集群建立与配置
建立集群时设置
通过控制台建立集群阿里云容器服务提供的非常简易的一键部署集群功能通过向导完成 K8S 集群的建立按照以上规划设置 masterworker 节点挂载 /var/lib/docker 到数据盘设置合理的 Pod 网络 CIDR, Service CIDR ip 网段设置合理的安全策略是否暴露 apiserver需要直接云效发布的需要开放公网暴露并做严格的访问控制;ingress 选择安全可以使用内网如果需要公网可以在控制台很方便建立同时做好访问控制kube-proxy 模式因为 iptables 模式在更新一条规则时把 iptables 锁住引发的性能问题建议使用 IPVS 模式节点 POD 数量默认 128 太大一个节点不可能部署这么多建议改为 64节点服务端口访问 (NodePort,SLB可以适当扩大默认的也一般足够用。
集群配置修改
集群扩容,添加已有节点节点配置参考上文挂载数据盘使用 /var/lib/docker Master 机器升配 worker 节点变配或者移除 kubectl drain --ignore-daemonsets {node.name}kubectl delete node {node.name}ECS 升配变配添加已有节点到集群 命名空间 按照应用分组建立 namespace对于资源占用厉害需要限制的应用分组设置该 NameSpace 的资源配额与限制 授权 子账号如何给其他子账号进行 RBAC 授权通过堡垒机按应用人员设置权限部署设置 无状态部署
使用无状态部署 Deployment参考这篇文章实现分批发布。 优化设置模板
apiVersion: apps/v1beta2
kind: Deployment
metadata:annotations:deployment.kubernetes.io/revision: 34
# 标签映射 servicelabels:app: {app_name}-aonename: {app_name}-aone-1namespace: {app_name}
spec:progressDeadlineSeconds: 600replicas: 1revisionHistoryLimit: 10selector:matchLabels:app: {app_name}-aone
# 批量重启更新策略 strategy:rollingUpdate:maxSurge: 25%maxUnavailable: 25%type: RollingUpdatetemplate:metadata:labels:app: {app_name}-aonespec:containers:# 环境变量增加时区- env:- name: TZvalue: Asia/Shanghai- image: -registry-vpc.cn-north-2-gov-1.aliyuncs.com/{namespace}/{app_name}:20190820190005imagePullPolicy: Always# 启动前执行优雅下线摘除 服务注册lifecycle:preStop:exec:command:- sudo- -u- admin- /home/{user_name}/{app_name}/bin/appctl.sh- {app_name}- stop# 存活检查强烈建议设置 livenessProbe:failureThreshold: 10initialDelaySeconds: 30periodSeconds: 10successThreshold: 1tcpSocket:port: 5900timeoutSeconds: 1name: {app_name}-aone# 就绪检查强烈建议设置readinessProbe:failureThreshold: 10initialDelaySeconds: 30periodSeconds: 10successThreshold: 1tcpSocket:port: 5900timeoutSeconds: 1# 资源限制这个一定要合理设置 resources:limits:cpu: 4memory: 8Girequests:cpu: 4memory: 8GiterminationMessagePath: /dev/termination-logterminationMessagePolicy: File# 日志存放目录映射到节点的/var/lib/docker/logs 数据盘应用日志目录设置到/home/{user_name}/logs 下volumeMounts:- mountPath: /home/{user_name}/logsname: volume-1553755418538dnsPolicy: ClusterFirst## 私有镜像仓库的密钥从保密字段获取imagePullSecrets:- name: {app_name}-987restartPolicy: AlwaysschedulerName: default-schedulersecurityContext: {}terminationGracePeriodSeconds: 30# 日志存放目录映射到节点的/var/lib/docker/logs 数据盘volumes:- hostPath:path: /var/lib/docker/logs/{app_name}type: name: volume-1553755418538 服务设置
因为容器服务的 Cloud Controller Manager 会同步删除 service 建立关联的 SLB为了防止 service 配置修改误删除 slb 故障并导致域名、安全等配置需要修改的坑强烈建议 service 与 slb 解耦service 采用 NodePort 的方式slb 另外建立后端服务器指向集群节点如果需要透传真实 IP并考虑负载均衡需要遵守一定的配置规则和方法参考这个文章。
NodePort:
apiVersion: v1
kind: Service
metadata:name: {app_name}namespace: {namespaces}
spec:clusterIP: 10.1.50.65
## 策略关系到是否透传真实 IPexternalTrafficPolicy: Clusterports:- name: {app_name}-80-7001nodePort: 32653port: 80protocol: TCPtargetPort: 7001- name: {app_name}-5908-5908nodePort: 30835port: 5108protocol: TCPtargetPort: 5108selector:app: {app_name}sessionAffinity: Nonetype: NodePort
status:loadBalancer: {}
然后在负载均衡管理页面选择后端服务器指向集群的 worker 机器设置端口为以上服务的端口32653完成配置这样在集群 service 修改或者删除重建的时候slb 不会被集群的 CCM 删除不会涉及到域名安全等配置修改。同时可以设置一些策略需要升级修改服务配置时分批切流等。 总结
阿里云容器服务控制台虽然是云上新产品提供了极其简单的一键部署功能以及简便的控制台管理。过去一年中笔者一路见识阿里云容器服务控制台从简陋向强大的转变过程虽然多次踩坑但阿里云容器服务同学认真负责和极好的服务态度让人佩服。
容器服务管理控制台还需要更多的考虑实际运维需求并紧密结合已有的云产品比如云效、EDAS、云监控、日志服务等以应用为单位提供更好服务。
原文链接 本文为云栖社区原创内容未经允许不得转载。