在GCP和Azure上使用Kubernetes的指南
1. GCP上的Kubernetes
1.1 多区域集群
GKE支持多区域集群,允许在同一区域的多个区域中启动Kubernetes节点。之前的示例中,Kubernetes节点仅在 asia-northeast1-a 区域配置,现在重新配置一个包含 asia-northeast1-a 、 asia-northeast1-b 和 asia-northeast1-c 三个区域的集群。操作步骤如下:
1. 删除之前的集群:
$ gcloud container clusters delete my-k8s-cluster --zone asia-northeast1-a
按照提示输入 y 确认删除。
2. 创建新的多区域集群,每个区域有2个节点:
$ gcloud container clusters create my-k8s-cluster --machine-type f1-micro -num-nodes 2 --network my-custom-network --subnetwork subnet-c --tags private --zone asia-northeast1-a --node-locations asia-northeast1-a,asia-northeast1-b,asia-northeast1-c
- 查看新添加的节点:
$ kubectl get nodes
输出如下:
| NAME | STATUS | ROLES | AGE | VERSION |
| — | — | — | — | — |
| gke-my-k8s-cluster-default-pool-58e4e9a4-74hc | Ready |
| 43s | v1.10.9-gke.5 |
| gke-my-k8s-cluster-default-pool-58e4e9a4-8jft | Ready |
| 1m | v1.10.9-gke.5 |
| gke-my-k8s-cluster-default-pool-f7baf2e1-lk7j | Ready |
| 1m | v1.10.9-gke.5 |
| gke-my-k8s-cluster-default-pool-f7baf2e1-zktg | Ready |
| 1m | v1.10.9-gke.5 |
| gke-my-k8s-cluster-default-pool-fa5a04a5-bbj5 | Ready |
| 1m | v1.10.9-gke.5 |
| gke-my-k8s-cluster-default-pool-fa5a04a5-d35z | Ready |
| 1m | v1.10.9-gke.5 |
可以使用 failure-domain.beta.kubernetes.io/zone Kubernetes标签区分节点区域,以便指定所需的区域来部署Pod。
1.2 集群升级
Kubernetes项目更新频繁,大约每三个月发布一个新版本。GKE会及时添加对新版本的支持,可以通过 gcloud 命令升级主节点和工作节点。
1. 查看GKE支持的Kubernetes版本:
$ gcloud container get-server-config
部分输出示例:
defaultClusterVersion: 1.10.9-gke.5
defaultImageType: COS
validImageTypes:
- COS_CONTAINERD
- COS
- UBUNTU
validMasterVersions:
- 1.11.4-gke.8
- 1.11.3-gke.18
- 1.11.2-gke.20
...
validNodeVersions:
- 1.11.4-gke.8
- 1.11.3-gke.18
- 1.11.2-gke.20
...
- 升级主节点到
1.11.4-gke.8:
$ gcloud container clusters upgrade my-k8s-cluster --zone asia-northeast1-a --cluster-version 1.11.4-gke.8 --master
按照提示输入 y 确认升级,升级大约需要10分钟。
3. 验证主节点版本:
$ gcloud container clusters list --zone asia-northeast1-a
输出示例:
| NAME | LOCATION | MASTER_VERSION | MASTER_IP | MACHINE_TYPE | NODE_VERSION | NUM_NODES | STATUS |
| — | — | — | — | — | — | — | — |
| my-k8s-cluster | asia-northeast1-a | 1.11.4-gke.8 | 35.243.78.166 | f1-micro | 1.10.9-gke.5 * | 6 | RUNNING |
4. 升级所有节点到 1.11.4-gke.8 :
$ gcloud container clusters upgrade my-k8s-cluster --zone asia-northeast1-a --cluster-version 1.11.4-gke.8
按照提示输入 y 确认升级。GKE会进行滚动升级,每个节点依次执行以下步骤:
graph LR
A[从集群中注销目标节点] --> B[删除旧的VM实例]
B --> C[配置新的VM实例]
C --> D[使用1.11.4-gke.8版本设置节点]
D --> E[注册到主节点]
1.3 Kubernetes云提供商
GKE集成了Kubernetes云提供商,与GCP基础设施深度集成,如VPC路由的覆盖网络、持久磁盘的StorageClass和L4负载均衡器的服务。
1.3.1 StorageClass
GKE默认设置了StorageClass,使用持久磁盘:
1. 查看StorageClass:
$ kubectl get storageclass
输出:
NAME TYPE
standard (default) kubernetes.io/gce-pd
- 描述默认的StorageClass:
$ kubectl describe storageclass standard
输出:
Name: standard
IsDefaultClass: Yes
Annotations: storageclass.beta.kubernetes.io/is-default-class=true
Provisioner: kubernetes.io/gce-pd
Parameters: type=pd-standard
AllowVolumeExpansion: <unset>
MountOptions: <none>
ReclaimPolicy: Delete
VolumeBindingMode: Immediate
Events: <none>
- 创建持久卷声明:
$ cat pvc-gke.yml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-gke-1
spec:
storageClassName: "standard"
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
$ kubectl create -f pvc-gke.yml
- 查看持久卷:
$ kubectl get pv
输出示例:
NAME CAPACITY ACCESSMODES RECLAIMPOLICY STATUS CLAIM STORAGECLASS REASON AGE
pvc-bc04e717-8c82-11e7-968d-42010a920fc3 10Gi RWO Delete Bound default/pvc-gke-1 standard 2s
- 通过
gcloud命令查看:
$ gcloud compute disks list
输出示例:
NAME ZONE SIZE_GB TYPE STATUS
gke-my-k8s-cluster-d2e-pvc-bc04e717-8c82-11e7-968d-42010a920fc3 asia-northeast1-a 10 pd-standard READY
1.3.2 L4负载均衡器
GKE支持为Kubernetes服务使用L4负载均衡器,只需将 Service.spec.type 指定为 LoadBalancer ,GKE会自动设置和配置L4负载均衡器。
1. 部署带有负载均衡器服务的Grafana:
$ cat grafana.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: grafana
spec:
replicas: 1
selector:
matchLabels:
project: devops-with-kubernetes
app: grafana
template:
metadata:
labels:
project: devops-with-kubernetes
app: grafana
spec:
containers:
- image: grafana/grafana
name: grafana
ports:
- containerPort: 3000
---
apiVersion: v1
kind: Service
metadata:
name: grafana
spec:
ports:
- port: 80
targetPort: 3000
type: LoadBalancer
selector:
project: devops-with-kubernetes
app: grafana
$ kubectl create -f grafana.yml
- 查看L4负载均衡器的IP地址:
$ kubectl get svc grafana
输出示例:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
grafana LoadBalancer 10.59.244.97 35.243.118.88 80:31213/TCP 1m
- 测试访问:
$ curl -I 35.243.118.88
输出示例:
HTTP/1.1 302 Found
Content-Type: text/html; charset=utf-8
Location: /login
Set-Cookie: grafana_sess=186d81bd66d150d5; Path=/; HttpOnly
Set-Cookie: redirect_to=%252F; Path=/; HttpOnly
Date: Sun, 09 Dec 2018 02:25:48 GMT
1.3.3 L7负载均衡器(Ingress)
GKE支持Kubernetes Ingress,可以根据URL将HTTP请求分发到目标服务。
1. 创建使用NodePort服务的Nginx和Tomcat示例:
目前无法直接从互联网访问Kubernetes服务,因为没有允许访问的防火墙规则。可以使用以下命令通过Kubernetes API服务器访问Pod:
$ kubectl port-forward tomcat-670632475-l6h8q 10080:8080
然后在浏览器中打开 http://localhost:10080/ 访问Tomcat Pod。
2. 创建Ingress规则:
$ cat nginx-tomcat-ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: nginx-tomcat-ingress
spec:
rules:
- http:
paths:
- path: /
backend:
serviceName: nginx
servicePort: 80
- path: /examples
backend:
serviceName: tomcat
servicePort: 8080
- path: /examples/*
backend:
serviceName: tomcat
servicePort: 8080
$ kubectl create -f nginx-tomcat-ingress.yaml
- 等待约10 - 15分钟完成GCP组件配置:
$ kubectl get ing
输出示例:
NAME HOSTS ADDRESS PORTS AGE
nginx-tomcat-ingress * 107.178.253.174 80 1m
- 使用静态IP地址:
$ gcloud compute addresses create my-nginx-tomcat --global
$ gcloud compute addresses list
输出示例:
NAME REGION ADDRESS STATUS
my-nginx-tomcat 35.186.227.252 IN_USE
修改Ingress配置:
$ cat nginx-tomcat-static-ip-ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: nginx-tomcat-ingress
annotations:
kubernetes.io/ingress.global-static-ip-name: my-nginx-tomcat
spec:
rules:
- http:
paths:
- path: /
backend:
serviceName: nginx
servicePort: 80
- path: /examples
backend:
serviceName: tomcat
servicePort: 8080
- path: /examples/*
backend:
serviceName: tomcat
servicePort: 8080
$ kubectl apply -f nginx-tomcat-static-ip-ingress.yaml
$ kubectl get ing
输出示例:
NAME HOSTS ADDRESS PORTS AGE
nginx-tomcat-ingress * 35.186.227.252 80 48m
现在可以通过静态IP地址访问Ingress,如 http://35.186.227.252/ (Nginx)和 http://35.186.227.252/examples/ (Tomcat)。
2. Azure上的Kubernetes
2.1 Azure简介
Microsoft Azure提供平台即服务(PaaS),用户可以将应用程序部署到Azure应用服务,无需了解详细设置和VM管理。自2010年以来,Azure为许多用户提供Microsoft软件和第三方软件。每个Azure服务提供不同的定价层,也称为SKU。
Azure Kubernetes Service(AKS)于2017年推出,是对原Azure容器服务(ACS)的新支持。作为Kubernetes云提供商,AKS提供一些原生支持,如用于RBAC的Azure活动目录、用于存储类的Azure磁盘、用于服务的Azure负载均衡器和用于Ingress的HTTP应用程序路由。
2.2 资源组
Azure中的资源组是一组代表逻辑组的资源,可以一次性部署和删除组内的所有资源。Azure资源管理器可帮助管理资源组,Azure还提供资源管理器模板(JSON格式文件),定义所需资源的配置和依赖关系,用户可以将模板重复一致地部署到多个资源组。
操作步骤如下:
1. 注册Azure免费账户:访问 Azure门户 注册,可获得12个月的流行免费服务和30天的200美元信用额度。
2. 登录后,点击侧边栏的“Create a resource”,选择Web app,输入应用名称。
3. 创建资源时,指定资源组,可选择使用现有资源组或创建新的资源组。
4. 根据需要更改运行时堆栈。
5. 点击页面底部“Create”旁边的“Automation options”,可自动创建资源模板。点击“Deploy”会显示模板定义的自定义参数,这里直接点击“Create”。
6. 创建完成后,在“Recent resources”标签下找到新创建的资源组,如 devops-app 。
7. 点击资源组可进入应用服务控制台,这是Azure的PaaS服务。
8. 访问指定URL(如 https://devops-app.azurewebsites.net/ )可查看部署的示例Web应用。
9. 还可以上传自己的Web应用,或与版本控制软件(如GitHub或Bitbucket)集成,使用Azure构建整个管道。更多信息可访问 部署中心页面 。
10. 在“Resource groups”控制台可以轻松删除资源组。
综上所述,GCP和Azure都为Kubernetes提供了强大的支持,用户可以根据自己的需求和偏好选择合适的云平台。在GCP上,Kubernetes集群和节点管理易于安装和升级,云提供商与GCP深度集成;在Azure上,AKS让用户无需担心底层基础设施,方便管理、部署和扩展容器化应用。
2.3 设置AKS
在Azure上设置AKS集群,需要完成一系列步骤,下面将详细介绍:
1. 安装Azure CLI :
首先,需要在本地环境中安装Azure CLI,以便通过命令行与Azure进行交互。可以根据不同的操作系统,按照官方文档的指引进行安装。
2. 登录Azure账户 :
安装完成后,打开终端,运行以下命令登录Azure账户:
bash az login
执行该命令后,会在浏览器中打开登录页面,按照提示完成登录操作。
3. 创建资源组 :
为AKS集群创建一个资源组,资源组是对Azure资源进行逻辑分组的容器。使用以下命令创建资源组,其中 myResourceGroup 是资源组的名称, eastus 是资源组所在的区域:
bash az group create --name myResourceGroup --location eastus
4. 创建AKS集群 :
使用以下命令创建AKS集群,其中 myAKSCluster 是集群的名称, --node-count 3 表示创建3个节点:
bash az aks create --resource-group myResourceGroup --name myAKSCluster --node-count 3 --generate-ssh-keys
该命令会自动生成SSH密钥,用于与节点进行通信。创建过程可能需要一些时间。
5. 配置kubectl :
创建完成后,需要配置 kubectl 工具,使其能够与AKS集群进行交互。运行以下命令:
bash az aks get-credentials --resource-group myResourceGroup --name myAKSCluster
执行该命令后, kubectl 会被配置为使用新创建的AKS集群。
6. 验证集群 :
最后,通过以下命令验证集群是否正常运行:
bash kubectl get nodes
如果一切正常,会显示集群中的节点信息。
以下是设置AKS的步骤总结表格:
| 步骤 | 操作 | 命令示例 |
| — | — | — |
| 1 | 安装Azure CLI | 参考官方文档安装 |
| 2 | 登录Azure账户 | az login |
| 3 | 创建资源组 | az group create --name myResourceGroup --location eastus |
| 4 | 创建AKS集群 | az aks create --resource-group myResourceGroup --name myAKSCluster --node-count 3 --generate-ssh-keys |
| 5 | 配置kubectl | az aks get-credentials --resource-group myResourceGroup --name myAKSCluster |
| 6 | 验证集群 | kubectl get nodes |
2.4 Azure云提供商
AKS作为Kubernetes云提供商,与Azure的基础设施紧密集成,提供了多种功能,以下是一些主要的集成功能介绍:
- Azure磁盘存储类 :
AKS支持使用Azure磁盘作为Kubernetes的存储类。可以通过创建存储类对象来定义磁盘的属性,例如磁盘类型、大小等。以下是一个创建存储类的示例:
yaml apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: azure-disk provisioner: kubernetes.io/azure-disk parameters: skuName: Standard_LRS location: eastus
将上述内容保存为 azure-disk-storageclass.yaml 文件,然后使用以下命令创建存储类:
bash kubectl create -f azure-disk-storageclass.yaml
- Azure负载均衡器 :
当在AKS中创建Kubernetes服务时,如果将服务类型设置为 LoadBalancer ,Azure会自动创建一个负载均衡器来对外暴露服务。例如,以下是一个创建带有负载均衡器的服务的示例:
yaml apiVersion: v1 kind: Service metadata: name: my-service spec: selector: app: my-app ports: - protocol: TCP port: 80 targetPort: 8080 type: LoadBalancer
将上述内容保存为 my-service.yaml 文件,然后使用以下命令创建服务:
bash kubectl create -f my-service.yaml
创建完成后,Azure会自动分配一个公共IP地址给负载均衡器,可以通过该IP地址访问服务。
- Azure活动目录用于RBAC :
AKS支持与Azure活动目录(Azure AD)集成,用于实现基于角色的访问控制(RBAC)。可以通过配置Azure AD来管理用户和角色,从而精细地控制对Kubernetes集群的访问权限。具体的配置步骤较为复杂,需要参考Azure官方文档进行操作。
通过以上功能,AKS为用户提供了便捷的方式来管理Kubernetes集群,并与Azure的其他服务进行集成。
3. 总结
本文详细介绍了在GCP和Azure上使用Kubernetes的相关内容。在GCP方面,GKE提供了强大的功能,多区域集群允许在同一区域的多个区域部署节点,提高了集群的可用性和容错性。集群升级通过 gcloud 命令可以方便地完成主节点和工作节点的升级。Kubernetes云提供商与GCP基础设施深度集成,如StorageClass使用持久磁盘、L4和L7负载均衡器的配置等,简化了应用的部署和管理。
在Azure方面,Azure提供了平台即服务(PaaS),AKS作为Azure的Kubernetes服务,使用户无需担心底层基础设施,能够轻松管理、部署和扩展容器化应用。资源组的概念方便了资源的管理和部署,同时AKS与Azure的其他服务(如Azure磁盘、负载均衡器、Azure活动目录)紧密集成,提供了丰富的功能。
以下是GCP和Azure在Kubernetes使用方面的对比表格:
| 对比项 | GCP | Azure |
| — | — | — |
| 集群管理 | 集群和节点管理易于安装和升级 | 用户无需担心底层基础设施,方便管理、部署和扩展 |
| 云提供商集成 | 与GCP深度集成,如L7负载均衡器配置简单 | 与Azure基础设施紧密集成,提供多种功能 |
| 定价 | 有不同的定价策略 | 提供不同的定价层(SKU) |
总的来说,GCP和Azure都为Kubernetes提供了优秀的支持,用户可以根据自身的需求、预算和技术栈等因素,选择适合自己的云平台来运行Kubernetes应用。无论是对于小型项目还是大型企业级应用,这两个云平台都能提供可靠的解决方案。
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px;
A([选择云平台]):::startend --> B{选择GCP还是Azure}:::decision
B -->|GCP| C(创建多区域集群):::process
B -->|Azure| D(创建AKS集群):::process
C --> E(集群升级):::process
C --> F(使用云提供商功能):::process
D --> G(配置资源组):::process
D --> H(使用Azure云提供商功能):::process
E --> I([完成GCP上Kubernetes部署]):::startend
F --> I
G --> J([完成Azure上Kubernetes部署]):::startend
H --> J
这个流程图展示了在选择云平台(GCP或Azure)后,分别进行Kubernetes集群创建、升级和使用云提供商功能的过程,最终完成Kubernetes的部署。
超级会员免费看
44

被折叠的 条评论
为什么被折叠?



