当 Kubernetes 遇到阿里云

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
对象存储 OSS,20GB 3个月
应用型负载均衡 ALB,每月750个小时 15LCU
简介: 当 Kubernetes 遇到阿里云阿里云提供了丰富多样的云产品支持,包括ECS、VPC网络、经典网络、负载均衡SLB等等,可以帮助Docker应用轻松在云端运行。阿里云除了推出容器服务提供了一站式的容器应用管理解决方案,也在不断推动其他开源容器技术和阿里云的集成更好地满足用户的多样化需求。

当 Kubernetes 遇到阿里云

阿里云提供了丰富多样的云产品支持,包括ECS、VPC网络、经典网络、负载均衡SLB等等,可以帮助Docker应用轻松在云端运行。阿里云除了推出容器服务提供了一站式的容器应用管理解决方案,也在不断推动其他开源容器技术和阿里云的集成更好地满足用户的多样化需求。

本文将会介绍如何非常方便的在阿里云上运行起一个安全的高可用的Kubernetes集群。同时为了让Kubernetes用户更好的使用阿里云服务,容器服务团队为Kubernetes提供了阿里云CloudProvider,支持为Kubernetes service 创建阿里云LoadBalance; 也为Flannel编写了网络驱动,让Flannel可以更好的支持阿里云VPC网络;同时我们基于当前最新的kubernetes 1.6.0-alpha版本制作了阿里云上一键部署安装脚本,开箱即用。

前置条件

  • 支持阿里云CentOS 7.2-x64版本 、Ubuntu 16.04 x64版本
  • 支持阿里云VPC网络和经典网络,创建VPC网络的网段建议使用192.168.0.0或者10.0.0.0网段,可以避免与本次安装Kubernetes的默认网段172.16.0.0冲突。
  • 准备阿里云账号KeyID与KeySecret
  • 如果您需要下载任何墙外的镜像,请移步使用阿里云镜像服务加速器
  • 请至少准备两个ECS实例,其中 node1 将作为master节点,node2作为工作节点。请注意不要修改ECS实例的名称(包括hostname)。

安装Kubernetes

准备3个配置参数

  • 获取阿里云KeyID和KeySecret,请点击. 假设ACCESS_KEY_ID=xxxxxxxx, ACCESS_KEY_SECRET=xxxxxxxxxxxxxxxx
  • 创建ECS CentOS 7.2-x64版本或者Ubuntu 16.04 x64版本。记录ECS所在region,以下列表为支持的region。例如杭州region名称为cn-hangzhou. 假设REGION=cn-hangzhou

    Region名称        |            值            |Region名称        |            值            |
    ------------------|-----------------------|------------------|-----------------------|
    杭州                | cn-hangzhou        |新加坡         |  ap-southeast-1         |
    青岛                |  cn-qingdao        |上海                |  cn-shanghai        |
    北京                |  cn-beijing         |迪拜                |  me-east-1          |
    香港                |  cn-hongkong       |东京                |  ap-northeast-1     |
    深圳                |  cn-shenzhen       |悉尼                |  ap-southeast-2     |
    硅谷                |  us-west-1         |法兰克福             |  eu-central-1       |
    弗吉尼亚             |  us-east-1         |||
    

注意: VPC网络可以不用设置REGION参数,系统会自动推测。但是经典网络必须要设置REGION参数。

开始安装

  • 安装Master节点:ssh root@node1登录master节点安装master.注意将下面的$ACCESS_KEY_ID$ACCESS_KEY_SECRET$REGION替换成上一步中获得的参数。

    [root@node1 ~]# curl -L 'http://aliacs-k8s.oss-cn-hangzhou.aliyuncs.com/installer/kubemgr.sh' | \
                bash -s nice --node-type master --key-id $ACCESS_KEY_ID --key-secret $ACCESS_KEY_SECRET \
                    --region $REGION --discovery token://
    

    输出如下,注意记录输出中的token,TOKEN=token://xxxxxx:xxxxxxxxxxxxxxxx@12x.2x.24x.21x:989x

    docker has been installed
    3.0: Pulling from google-containers/pause-amd64
    Digest: sha256:3b3a29e3c90ae7762bdf587d19302e62485b6bef46e114b741f7d75dba023bd3
    
    ...
    
    [tokens] Generated token: "xxxxxx:xxxxxxxxxxxxxxxx"
    [certificates] Generated Certificate Authority key and certificate.
    
    ...
    
    [apiclient] All control plane components are healthy after 17.286402 seconds
    [apiclient] Waiting for at least one node to register and become ready
    [apiclient] First node is ready after 4.003314 seconds
    
    ...
    
    Your Kubernetes master has initialized successfully!
    
    You should now deploy a pod network to the cluster.
    
    ## 注意记录这个Token
    kubeadm join --discovery token://xxxxxx:xxxxxxxxxxxxxxxx@12x.2x.24x.21x:989x
    
    ...
    
    NAME                                              READY     STATUS              RESTARTS   AGE
    dummy-3158885821-vkv5q                            1/1       Running             0          5s
    etcd-izbp12l8fznm0yt7bas5p2z                      1/1       Running             0          19s
    kube-apiserver-izbp12l8fznm0yt7bas5p2z            1/1       Running             1          18s
    
    ...
    
    kubectl --namespace=kube-system get po
  • 安装Node节点:ssh root@node2登录到您的node2节点上。使用刚才您记录下来的token,执行以下命令,注意替换下面的变量:

    [root@node2 ~]# curl -L 'http://aliacs-k8s.oss-cn-hangzhou.aliyuncs.com/installer/kubemgr.sh' \
                    | bash -s nice --node-type node --key-id $ACCESS_KEY_ID --key-secret \
                    $ACCESS_KEY_SECRET --region $REGION --discovery $TOKEN
    

    输出如下:

    docker has been installed
    3.0: Pulling from google-containers/pause-amd64
    
    ...
    
    Digest: sha256:3b3a29e3c90ae7762bdf587d19302e62485b6bef46e114b741f7d75dba023bd3
    Status: Image is up to date for registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0
    [preflight] Running pre-flight checks
    [discovery] Created cluster info discovery client, requesting info from "http://12x.2x.24x.21x:989x/cluster-info/v1/?token-id=56974f"
    [discovery] Cluster info object received, verifying signature using given token
    [discovery] Cluster info signature and contents are valid, will use API endpoints [https://12x.2x.24x.21x:6443]
    [bootstrap] Trying to connect to endpoint https://12x.2x.24x.21x:6443
    [bootstrap] Detected server version: v1.6.0-alpha.0.2229+88fbc68ad99479-dirty
    [bootstrap] Successfully established connection with endpoint "https://12x.2x.24x.21x:6443"
    [csr] Created API client to obtain unique certificate for this node, generating keys and certificate signing request
    [csr] Received signed certificate from the API server:
    Issuer: CN=kubernetes | Subject: CN=system:node:iZbp12l8fznm0yt7bas5p1Z | CA: false
    Not before: 2017-01-18 07:46:00 +0000 UTC Not After: 2018-01-18 07:46:00 +0000 UTC
    [csr] Generating kubelet configuration
    [kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/kubelet.conf"
    
    Node join complete:
    * Certificate signing request sent to master and response
      received.
    * Kubelet informed of new secure connection details.
    
    Run 'kubectl get nodes' on the master to see this machine join.

    Congratulations! 您已经成功的安装的了一个master和一个node节点。您可以重复在其他机器上执行安装node操作来添加更多节点。但是要让Kubernetes能正常运行您还需要为集群添加网络支持。

为集群添加网络支持

目前阿里云支持两种类型的网络:VPC网络和经典网络。请根据您的集群的网络类型不同为kubernetes选择相应的网络组件。

注意:以下两种网络只需要按照您的实际网络情况安装对应的一种。

方案一、增加VPC 网络支持: (适用于VPC网络)我们专门为flannel编写了vpc支持的插件。为Kubernetes安装flannel网络插件支持也非常容易。注意修改flannel-vpc.yml 文件中的replace with your id为您自己的KEY_ID和KEY_SECRET。在Master node上面执行下面的命令:

[root@node1 ~]# curl -sSL http://aliacs-k8s.oss-cn-hangzhou.aliyuncs.com/conf/flannel-vpc.yml -o flannel-vpc.yml
[root@node1 ~]# vi flannel-vpc.yml
[root@node1 ~]# kubectl apply -f flannel-vpc.yml

等待一会儿,然后使用kubectl --namespace=kube-system get ds 列出所有kube-system命名空间下的所有daemonsets,您会看见一个名字叫kube-falnnel的ds处于Running状态. 说明网络部署成功。

[root@node1 ~]# kubectl get ds --namespace=kube-system
NAME              DESIRED   CURRENT   READY     NODE-SELECTOR   AGE
kube-flannel-ds   2         2         2         <none>          2h
kube-proxy        2         2         2         <none>          2h

方案二、增加经典网络支持: (适用于经典网络和VPC网络)通过flannel的VXLAN,我们可以为Pod打通经典网络内的网络连通性。安装经典网络支持同样很简单,运行以下命令即可:

[root@node1 ~]# kubectl apply -f http://aliacs-k8s.oss-cn-hangzhou.aliyuncs.com/conf/flannel-vxlan.yml

等待一会儿,通过命令kubectl --namespace=kube-system get ds 可以查看您的网络插件的运行状态。安装完成,收工。

在您的Kubernetes集群里创建应用

运行nginx应用

现在运行一个nginx应用,运行以下命令创建一个具有两个nginx副本的应用。

[root@node1 ~]# kubectl run nginx --image=registry.cn-hangzhou.aliyuncs.com/spacexnice/nginx:latest --replicas=2 --labels run=nginx

deployment "nginx" created
[root@node1 ~]# kubectl get po
NAME                     READY     STATUS    RESTARTS   AGE
nginx-3579028506-9qxxl   1/1       Running   0          50s
nginx-3579028506-p032g   1/1       Running   0          50s

然后为nginx应用创建服务。可以指定type=Loadbalance来启用阿里云SLB能力,阿里云CloudProvider会自动为该服务创建LoadBalance。

[root@node1 ~]# kubectl expose deployment nginx --port=80 --target-port=80 --type=LoadBalancer

service "nginx" exposed
[root@node1 ~]# kubectl get svc
NAME         CLUSTER-IP     EXTERNAL-IP      PORT(S)        AGE
kubernetes   172.19.0.1     <none>           443/TCP        3h
nginx        172.19.6.158   118.178.111.31   80:30146/TCP   6s

现在打开您的浏览器访问http://118.178.111.31(注意,这儿需要替换成您自己的EXTERNAL-IP)吧,熟悉的Welcome to nginx!是否出现。您还可以去您的阿里云SLB控制台上确认SLB相关信息。

重置节点

当您发现安装过程有错误,或者想卸载Kubernetes安装的时候,随时执行如下命令即可卸载安装。

[root@node1 ~]# curl -L 'http://aliacs-k8s.oss-cn-hangzhou.aliyuncs.com/installer/kubemgr.sh' | bash -s nice --node-type down

阿里云SLB能力支持

Kubernetes阿里云CloudProvider提供了丰富的annotation来让用户高度定制化自己的SLB的行为,支持创建一个https和http的SLB,支持自定义SLB的带宽,支持自定义SLB健康检查,SLB网络地址类型等等。

为nginx创建一个https的SLB

如将刚刚创建的nginx服务的SLB类型更换成https,可以执行如下操作步骤:

  • 前往阿里云SLB控制台将您自己的https证书上传到阿里云。并记录生成的certid。假如生成的certid=124395s8ifs8ffftte.
  • 为刚刚创建的service添加相应的annotation(每个可用的annotation的含义见附表).并将spec节中的port更改为443端口。使用命令kubectl edit svc nginx来编辑刚刚创建的服务,编辑完成后按:wq保存即可:

    [root@node1 ~]# kubectl edit svc nginx
    apiVersion: v1
    kind: Service
    metadata:
    annotations:
      service.beta.kubernetes.io/alicloud-loadbalancer-ProtocolPort: "https:443"
      service.beta.kubernetes.io/alicloud-loadbalancer-Bandwidth: 60
      service.beta.kubernetes.io/alicloud-loadbalancer-CertID: "replace with your certid"
      service.beta.kubernetes.io/alicloud-loadbalancer-HealthCheckFlag: off
    creationTimestamp: 2017-01-18T10:45:32Z
    labels:
      run: nginx
    name: nginx
    namespace: default
    resourceVersion: "14365"
    selfLink: /api/v1/namespaces/default/services/nginx
    uid: 3c0e72e1-dd6b-11e6-b1ec-00163e0c1de5
    spec:
    clusterIP: 172.19.6.158
    ports:
    - nodePort: 30146
      port: 443
      protocol: TCP
      targetPort: 80
    selector:
      run: nginx
    sessionAffinity: None
    type: LoadBalancer
    status:
    loadBalancer:
      ingress:
      - ip: 118.178.111.31

稍等片刻,然后访问https://118.178.111.31即可看到一个安全的https nginx服务。 Go rock and roll!

小结

阿里云提供一个开放的公有云环境,为开源社区软件提供丰富的运行环境。您可以十分方便的在阿里云环境上搭建一个kubernetes集群来运行您的服务,但是阿里云容器服务为您提供了一站式解决方案,使用阿里云容器服务可以免去您集群运维的烦恼。

阿里云容器服务团队致力于在阿里云上推广容器技术。想了解更多容器服务内容,请访问https://www.aliyun.com/product/containerservice

附件 可用Annotation列表参考
Annotation Description Default
service.beta.kubernetes.io/alicloud-loadbalancer-ProtocolPort comma separated pair like "https:443,http:80" none
service.beta.kubernetes.io/alicloud-loadbalancer-AddressType Be "internet" or "intranet" "internet"
service.beta.kubernetes.io/alicloud-loadbalancer-SLBNetworkType slb network type, which is classic or vpc Be "classic" or "vpc"
service.beta.kubernetes.io/alicloud-loadbalancer-ChargeType Be "paybytraffic" or "payby bandwidth" "paybybandwidth"
service.beta.kubernetes.io/alicloud-loadbalancer-Region Which region this SLB in
service.beta.kubernetes.io/alicloud-loadbalancer-Bandwidth SLB bandwidth 50
service.beta.kubernetes.io/alicloud-loadbalancer-CertID certification id on AlibabaCloud, you need to upload first ""
service.beta.kubernetes.io/alicloud-loadbalancer-HealthCheckFlag "on" or "off" "off" tcp no need for this mark because it default to "on"
service.beta.kubernetes.io/alicloud-loadbalancer-HealthCheckType see HealthCheck
service.beta.kubernetes.io/alicloud-loadbalancer-HealthCheckURI see HealthCheck
service.beta.kubernetes.io/alicloud-loadbalancer-HealthCheckConnectPort see HealthCheck
service.beta.kubernetes.io/alicloud-loadbalancer-HealthyThreshold see HealthCheck
service.beta.kubernetes.io/alicloud-loadbalancer-UnhealthyThreshold see HealthCheck
service.beta.kubernetes.io/alicloud-loadbalancer-HealthCheckInterval see HealthCheck
service.beta.kubernetes.io/alicloud-loadbalancer-HealthCheckConnectTimeout see HealthCheck
service.beta.kubernetes.io/alicloud-loadbalancer-HealthCheckTimeout see HealthCheck
相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
5天前
|
人工智能 Prometheus 监控
使用 NVIDIA NIM 在阿里云容器服务(ACK)中加速 LLM 推理
本文介绍了在阿里云容器服务 ACK 上部署 NVIDIA NIM,结合云原生 AI 套件和 KServe 快速构建高性能模型推理服务的方法。通过阿里云 Prometheus 和 Grafana 实现实时监控,并基于排队请求数配置弹性扩缩容策略,提升服务稳定性和效率。文章提供了详细的部署步骤和示例,帮助读者快速搭建和优化模型推理服务。
43 7
使用 NVIDIA NIM 在阿里云容器服务(ACK)中加速 LLM 推理
|
6天前
|
人工智能 Prometheus 监控
使用NVIDIA NIM在阿里云ACK中加速LLM推理
介绍在阿里云ACK集群上结合AI套件能力快速部署NVIDIA NIM模型推理服务,同时提供全面的监控指标和实现弹性伸缩。
使用NVIDIA NIM在阿里云ACK中加速LLM推理
|
9天前
|
Kubernetes 网络虚拟化 Docker
K8S镜像下载报错解决方案(使用阿里云镜像去下载kubeadm需要的镜像文件)
文章提供了一个解决方案,用于在无法直接访问Google镜像仓库的情况下,通过使用阿里云镜像来下载kubeadm所需的Kubernetes镜像。
24 3
K8S镜像下载报错解决方案(使用阿里云镜像去下载kubeadm需要的镜像文件)
|
24天前
|
运维 Kubernetes Devops
阿里云云效操作报错合集之k8s直接返回401,该如何排查
本合集将整理呈现用户在使用过程中遇到的报错及其对应的解决办法,包括但不限于账户权限设置错误、项目配置不正确、代码提交冲突、构建任务执行失败、测试环境异常、需求流转阻塞等问题。阿里云云效是一站式企业级研发协同和DevOps平台,为企业提供从需求规划、开发、测试、发布到运维、运营的全流程端到端服务和工具支撑,致力于提升企业的研发效能和创新能力。
阿里云云效操作报错合集之k8s直接返回401,该如何排查
|
1月前
|
弹性计算 运维 负载均衡
基于阿里云容器服务Kubernetes版(ACK)| 容器化管理云上应用
【8月更文挑战第3天】基于阿里云容器服务Kubernetes版(ACK)| 容器化管理云上应用
|
2月前
|
运维 Kubernetes 负载均衡
# 阿里云ACK产品评测
阿里云 ACK (Alibaba Cloud Container Service for Kubernetes) 是一站式容器管理服务,简化容器应用部署、管理及运维。具备友好Web界面与CLI工具;无缝集成阿里云RDS、SLB、OSS等服务;提供RBAC、网络策略及镜像安全扫描等功能确保安全;基于阿里云基础设施,支持自动伸缩与负载均衡保证高性能。通过部署WordPress案例演示具体流程,包括集群创建、kubectl配置及WordPress+MySQL部署。ACK适合各类用户,高效便捷。注意:官方镜像可能拉取失败,建议使用阿里云ECS拉取或上传至容器镜像服务。
92 3
|
2月前
|
弹性计算 Kubernetes 监控
阿里云 ACK 容器服务评测
在现代企业的数字化转型过程中,容器化技术逐渐成为提高应用部署效率、增强系统弹性和灵活性的关键手段。阿里云的容器服务 Kubernetes 版(ACK)是一个完全托管的 Kubernetes 容器管理服务,旨在帮助企业轻松实现应用的容器化管理和部署。本文将对阿里云 ACK 容器服务的核心功能、性能表现及实际使用体验进行评测,帮助读者更好地理解这一产品。
130 0
|
2月前
|
Kubernetes 关系型数据库 容器
阿里云ACK产品评测
阿里云 ACK (Alibaba Cloud Container Service for Kubernetes) 是一站式容器管理服务,简化容器应用部署、管理及运维。具备友好Web界面与CLI工具;无缝集成阿里云RDS、SLB、OSS等服务;提供RBAC、网络策略及镜像安全扫描等功能确保安全;基于阿里云基础设施,支持自动伸缩与负载均衡保证高性能。通过部署WordPress案例演示具体流程,包括集群创建、kubectl配置及WordPress+MySQL部署。ACK适合各类用户,高效便捷。注意:官方镜像可能拉取失败,建议使用阿里云ECS拉取或上传至容器镜像服务。
124 0
|
2月前
|
人工智能 运维 安全
阿里云容器服务ACK:高效管理云上应用的容器化解决方案
阿里云容器服务ACK(Alibaba Cloud Container Service for Kubernetes)为开发者提供了一套全面的容器化管理解决方案,旨在简化云上应用的部署、运维和管理。本文将深入探讨ACK的功能、优势及应用场景,为开发者展现容器化技术在云环境下的强大能力。
160 0
|
24天前
|
敏捷开发 Kubernetes 测试技术
阿里云云效产品使用合集之如何在K8s集群上进行构建
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。