在GCP上部署Kubernetes:网络、负载均衡与存储配置全解析
1. 子网(Subnets)
在Google Cloud Platform(GCP)中,子网总是跨区域内的多个可用区。与AWS不同,你不能像在AWS中那样在单个可用区创建子网,创建子网时需要指定整个区域。
GCP中没有像AWS那样明确的公共和私有子网概念。因为GCP中的所有子网都有通往互联网网关的路由,GCP使用基于网络标签的主机(实例)级访问控制来确保网络安全,而非子网级访问控制。
技术上,你可以启动一个VM实例作为NAT网关或HTTP代理,然后为私有子网创建一个指向NAT/代理实例的自定义优先级路由,以实现类似AWS的私有子网。具体详情可参考: https://cloud.google.com/compute/docs/vpc/special-configurations
GCP VPC的一个有趣且独特的概念是,你可以将不同CIDR前缀的网络块添加到单个VPC中。例如,在自定义模式的VPC中添加以下三个子网:
- subnet-a (10.0.1.0/24) 来自 us-west1
- subnet-b (172.16.1.0/24) 来自 us-east1
- subnet-c (192.168.1.0/24) 来自 asia-northeast1
使用以下命令创建这三个不同区域、不同CIDR前缀的子网:
$ gcloud compute networks subnets create subnet-a --network=my-custom-network --range=10.0.1.0/24 --region=us-west1
$ gcloud compute networks subnets create subnet-b --network=my-custom-network --range=172.16.1.0/24 --region=us-east1
$ gcloud compute networks subnets create subnet-c --network=my-custom-network --range=192.168.1.0/24 --region=asia-northeast1
这意味着,当你需要扩展网络时,可以随时分配另一个CIDR前缀添加到VPC中。
2. 防火墙规则(Firewall rules)
GCP的防火墙规则对于实现网络安全至关重要,且比AWS安全组(SG)更简单灵活。在AWS中,启动EC2实例时必须至少分配一个与EC2紧密耦合的SG;而在GCP中,不能直接分配防火墙规则,防火墙规则和VM实例通过网络标签松散耦合,二者没有直接关联。
以下是创建公共主机(使用网络标签 public )和私有主机(使用网络标签 private )防火墙规则的命令:
# 创建公共主机的ssh访问规则
$ gcloud compute firewall-rules create public-ssh --network=my-custom-network --allow="tcp:22" --source-ranges="0.0.0.0/0" --target-tags="public"
# 创建公共主机的http访问规则 (80/tcp)
$ gcloud compute firewall-rules create public-http --network=my-custom-network --allow="tcp:80" --source-ranges="0.0.0.0/0" --target-tags="public"
# 创建私有主机的ssh访问规则(允许来自具有 "public" 标签的主机)
$ gcloud compute firewall-rules create private-ssh --network=my-custom-network --allow="tcp:22" --source-tags="public" --target-tags="private"
# 创建内部主机之间的icmp访问规则(允许来自具有 "public" 或 "private" 标签的主机)
$ gcloud compute firewall-rules create internal-icmp --network=my-custom-network --allow="icmp" --source-tags="public,private"
3. VM实例(VM instance)
GCP中的VM实例与AWS EC2类似,你可以选择各种不同硬件配置的机器(实例)类型,以及基于Linux或Windows的操作系统镜像,甚至可以使用自定义的操作系统。
在启动VM实例时,可以指定零个或多个网络标签,标签无需事先创建。这意味着即使尚未创建防火墙规则,你也可以先启动带有网络标签的VM实例,此时虽然没有应用防火墙规则,但实例仍然有效。之后创建带有相应网络标签的防火墙规则,规则会应用到VM实例上,这种松散耦合为用户提供了灵活性。
在启动VM实例之前,需要像在AWS EC2中一样创建一个SSH公钥。最简单的方法是运行以下命令创建并注册一个新密钥:
# 创建新的ssh密钥对
$ gcloud compute config-ssh
# 密钥将存储在 ~/.ssh/google_compute_engine(.pub)
$ cd ~/.ssh
$ ls -l google_compute_engine*
-rw------- 1 saito admin 1766 Aug 23 22:58 google_compute_engine
-rw-r--r-- 1 saito admin 417 Aug 23 22:58 google_compute_engine.pub
接下来,在子网 subnet-a 和 subnet-b 上部署两个公共实例(使用 public 网络标签),并在 subnet-a 上启动一个私有实例(使用 private 网络标签):
# 在 subnet-a 上创建公共实例("public" 标签)
$ gcloud compute instances create public-on-subnet-a --machine-type=f1-micro --network=my-custom-network --subnet=subnet-a --zone=us-west1-a --tags=public
# 在 subnet-b 上创建公共实例("public" 标签)
$ gcloud compute instances create public-on-subnet-b --machine-type=f1-micro --network=my-custom-network --subnet=subnet-b --zone=us-east1-c --tags=public
# 在 subnet-a 上创建私有实例("private" 标签),使用较大规格 (g1-small)
$ gcloud compute instances create private-on-subnet-a --machine-type=g1-small --network=my-custom-network --subnet=subnet-a --zone=us-west1-a --tags=private
使用以下命令查看创建的VM实例:
$ gcloud compute instances list
NAME ZONE MACHINE_TYPE PREEMPTIBLE INTERNAL_IP EXTERNAL_IP STATUS
public-on-subnet-b us-east1-c f1-micro 172.16.1.2 35.196.228.40 RUNNING
private-on-subnet-a us-west1-a g1-small 10.0.1.2 104.199.121.234 RUNNING
public-on-subnet-a us-west1-a f1-micro 10.0.1.3 35.199.171.31 RUNNING
为了检查防火墙规则是否按预期工作,需要将SSH密钥添加到本地的ssh-agent中:
$ ssh-add ~/.ssh/google_compute_engine
Enter passphrase for /Users/saito/.ssh/google_compute_engine:
Identity added: /Users/saito/.ssh/google_compute_engine (/Users/saito/.ssh/google_compute_engine)
由于ICMP规则只允许具有 public 或 private 标签的主机通信,因此从本地机器ping这些实例应该被拒绝。而公共主机允许从本地机器进行SSH连接,因为 public-ssh 规则允许任何来源(0.0.0.0/0)。
可以通过私有IP地址从公共主机ping和SSH到 subnet-a 上的私有主机,因为有 internal-icmp 和 private-ssh 规则。
接下来,登录到私有主机并安装 tomcat8 和 tomcat8-examples 包:
# 登录到私有主机
$ ssh 10.0.1.2
# 安装 tomcat8 和 tomcat8-examples 包
$ sudo apt-get -y install tomcat8 tomcat8-examples
然后,从本地机器通过SSH在公共主机( public-on-subnet-a 和 public-on-subnet-b )上安装 nginx :
# 退出VM实例,回到本地机器
$ exit
# 通过ssh在公共主机上安装nginx
$ ssh 35.196.228.40 "sudo apt-get -y install nginx"
$ ssh 35.199.171.31 "sudo apt-get -y install nginx"
# 检查防火墙规则 (public-http) 是否生效
$ curl -I http://35.196.228.40/
HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Sun, 27 Aug 2017 07:07:01 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Fri, 25 Aug 2017 05:48:28 GMT
Connection: keep-alive
ETag: "599fba2c-264"
Accept-Ranges: bytes
此时,无法访问私有主机上的Tomcat,即使它有公共IP地址,因为私有主机还没有允许 8080/tcp 的防火墙规则:
$ curl http://104.199.121.234:8080/examples/
curl: (7) Failed to connect to 104.199.121.234 port 8080: Operation timed out
4. 负载均衡(Load balancing)
GCP提供了以下几种类型的负载均衡器:
- Layer 4 TCP LoadBalancer
- Layer 4 UDP LoadBalancer
- Layer 7 HTTP(S) LoadBalancer
Layer 4(TCP和UDP)负载均衡器类似于AWS Classic ELB,而Layer 7 HTTP(S) 负载均衡器具有基于内容(上下文)的路由功能。例如,URL /img 将转发到实例 instance-a ,其他所有请求将转发到实例 instance-b ,更像是应用程序级别的负载均衡器。
要设置负载均衡器,与AWS ELB不同,需要事先配置一些项目,具体如下表所示:
| 配置项 | 用途 |
| ---- | ---- |
| 实例组(Instance group) | 确定VM实例组或VM模板(操作系统镜像) |
| 健康检查(Health check) | 设置健康阈值(间隔、超时等)以确定实例组的健康状态 |
| 后端服务(Backend service) | 为实例组设置负载阈值(最大CPU或每秒请求数)和会话亲和性(粘性会话),并关联健康检查 |
| url-maps(LoadBalancer) | 实际代表L7负载均衡器的占位符,关联后端服务和目标HTTP(S) 代理 |
| 目标HTTP(S) 代理(Target HTTP(S) proxy) | 建立前端转发规则与负载均衡器之间的关系 |
| 前端转发规则(Frontend forwarding rule) | 关联IP地址(临时或静态)、端口号到目标HTTP代理 |
| 外部IP(静态)(External IP (static)) | (可选)为负载均衡器分配静态外部IP地址 |
以下是设置负载均衡器的步骤:
4.1 创建实例组
# 创建HTTP实例和tomcat实例的实例组
$ gcloud compute instance-groups unmanaged create http-ig-us-west --zone us-west1-a
$ gcloud compute instance-groups unmanaged create http-ig-us-east --zone us-east1-c
$ gcloud compute instance-groups unmanaged create tomcat-ig-us-west --zone us-west1-a
# 因为tomcat使用8080/tcp,创建一个名为tomcat:8080的新命名端口
$ gcloud compute instance-groups unmanaged set-named-ports tomcat-ig-us-west --zone us-west1-a --named-ports tomcat:8080
# 将现有VM实例注册到相应的实例组
$ gcloud compute instance-groups unmanaged add-instances http-ig-us-west --instances public-on-subnet-a --zone us-west1-a
$ gcloud compute instance-groups unmanaged add-instances http-ig-us-east --instances public-on-subnet-b --zone us-east1-c
$ gcloud compute instance-groups unmanaged add-instances tomcat-ig-us-west --instances private-on-subnet-a --zone us-west1-a
4.2 健康检查
# 创建HTTP (80/tcp) 对 "/" 的健康检查
$ gcloud compute health-checks create http my-http-health-check --check-interval 5 --healthy-threshold 2 --unhealthy-threshold 3 --timeout 5 --port 80 --request-path /
# 创建Tomcat (8080/tcp) 对 "/examples/" 的健康检查
$ gcloud compute health-checks create http my-tomcat-health-check --check-interval 5 --healthy-threshold 2 --unhealthy-threshold 3 --timeout 5 --port 8080 --request-path /examples/
4.3 后端服务
# 创建HTTP (默认) 和命名端口tomcat (8080/tcp) 的后端服务
$ gcloud compute backend-services create my-http-backend-service --health-checks my-http-health-check --protocol HTTP --global
$ gcloud compute backend-services create my-tomcat-backend-service --health-checks my-tomcat-health-check --protocol HTTP --port-name tomcat --global
# 将HTTP实例组(us-west1和us-east1)添加到HTTP后端服务
$ gcloud compute backend-services add-backend my-http-backend-service --instance-group http-ig-us-west --instance-group-zone us-west1-a --balancing-mode UTILIZATION --max-utilization 0.8 --capacity-scaler 1 --global
$ gcloud compute backend-services add-backend my-http-backend-service --instance-group http-ig-us-east --instance-group-zone us-east1-c --balancing-mode UTILIZATION --max-utilization 0.8 --capacity-scaler 1 --global
# 将tomcat实例组添加到tomcat后端服务
$ gcloud compute backend-services add-backend my-tomcat-backend-service --instance-group tomcat-ig-us-west --instance-group-zone us-west1-a --balancing-mode UTILIZATION --max-utilization 0.8 --capacity-scaler 1 --global
4.4 创建负载均衡器
# 创建负载均衡器 (url-map) 并将my-http-backend-service作为默认关联
$ gcloud compute url-maps create my-loadbalancer --default-service my-http-backend-service
# 添加 /examples 和 /examples/* 映射到 my-tomcat-backend-service
$ gcloud compute url-maps add-path-matcher my-loadbalancer --default-service my-http-backend-service --path-matcher-name tomcat-map --path-rules /examples=my-tomcat-backend-service,/examples/*=my-tomcat-backend-service
# 创建关联到负载均衡器 (url-map) 的目标-http代理
$ gcloud compute target-http-proxies create my-target-http-proxy --url-map=my-loadbalancer
# 分配静态全局IP地址并查看分配的地址
$ gcloud compute addresses create my-loadbalancer-ip --global
$ gcloud compute addresses describe my-loadbalancer-ip --global
address: 35.186.192.6
# 创建将静态IP关联到目标-http代理的转发规则
$ gcloud compute forwarding-rules create my-frontend-rule --global --target-http-proxy my-target-http-proxy --address 35.186.192.6 --ports 80
如果不指定 --address 选项,将创建并分配一个临时外部IP地址。
此时,负载均衡器已创建,但私有主机还没有允许Tomcat流量(8080/tcp)的防火墙规则,因此 my-tomcat-backend-service 的健康状态将保持为 down (0) 。需要添加一个允许从负载均衡器到私有子网(使用 private 网络标签)连接的防火墙规则:
# 添加允许负载均衡器访问Tomcat (8080/tcp) 的防火墙规则
$ gcloud compute firewall-rules create private-tomcat --network=my-custom-network --source-ranges 130.211.0.0/22,35.191.0.0/16 --target-tags private --allow tcp:8080
几分钟后, my-tomcat-backend-service 的健康状态将变为 up (1) ,此时可以通过Web浏览器访问负载均衡器。访问 / 时,应路由到 my-http-backend-service (公共主机上的nginx应用程序);访问 /examples/ 时,将路由到 my-tomcat-backend-service (私有主机上的Tomcat应用程序)。
5. 持久磁盘(Persistent Disk)
Google Compute Engine(GCE)提供了一种名为持久磁盘(Persistent Disk,PD)的存储服务,类似于AWS EBS。你可以在每个可用区分配所需大小和类型(标准或SSD)的磁盘,并随时将其附加/分离到VM实例。
以下是创建并附加持久磁盘的步骤:
5.1 查看VM实例位置
$ gcloud compute instances list
NAME ZONE MACHINE_TYPE PREEMPTIBLE INTERNAL_IP EXTERNAL_IP STATUS
public-on-subnet-b us-east1-c f1-micro 172.16.1.2 35.196.228.40 RUNNING
private-on-subnet-a us-west1-a g1-small 10.0.1.2 104.199.121.234 RUNNING
public-on-subnet-a us-west1-a f1-micro 10.0.1.3 35.199.171.31 RUNNING
5.2 创建持久磁盘
选择 us-west1-a 并将其附加到 public-on-subnet-a :
# 在 us-west1-a 创建一个20GB的标准类型持久磁盘
$ gcloud compute disks create my-disk-us-west1-a --zone us-west1-a --type pd-standard --size 20
# 几秒钟后,查看磁盘状态
$ gcloud compute disks list
NAME ZONE SIZE_GB TYPE STATUS
public-on-subnet-b us-east1-c 10 pd-standard READY
my-disk-us-west1-a us-west1-a 20 pd-standard READY
private-on-subnet-a us-west1-a 10 pd-standard READY
public-on-subnet-a us-west1-a 10 pd-standard READY
5.3 附加持久磁盘
# 将持久磁盘 (my-disk-us-west1-a) 附加到VM实例 (public-on-subnet-a)
$ gcloud compute instances attach-disk public-on-subnet-a --disk my-disk-us-west1-a --zone us-west1-a
5.4 登录实例查看状态
# 登录到 public-on-subnet-a
$ ssh 35.199.171.31
# 查看磁盘状态
$ sudo su
$ dmesg | tail
[ 7377.421190] systemd[1]: apt-daily-upgrade.timer: Adding 25min 4.773609s random time.
[ 7379.202172] systemd[1]: apt-daily-upgrade.timer: Adding 6min 37.770637s random time.
[243070.866384] scsi 0:0:2:0: Direct-Access Google PersistentDisk 1 PQ: 0 ANSI: 6
[243070.875665] sd 0:0:2:0: [sdb] 41943040 512-byte logical blocks: (21.5 GB/20.0 GiB)
[243070.883461] sd 0:0:2:0: [sdb] 4096-byte physical blocks
[243070.889914] sd 0:0:2:0: Attached scsi generic sg1 type 0
[243070.900603] sd 0:0:2:0: [sdb] Write Protect is off
[243070.905834] sd 0:0:2:0: [sdb] Mode Sense: 1f 00 00 08
[243070.905938] sd 0:0:2:0: [sdb] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
[243070.925713] sd 0:0:2:0: [sdb] Attached SCSI disk
可以看到持久磁盘已附加到 /dev/sdb 。类似于AWS EBS,需要对该磁盘进行格式化,由于这是Linux操作系统的操作,具体步骤与在AWS上的操作相同。
6. Google容器引擎(Google Container Engine,GKE)
前面介绍了GCP的一些组件,现在可以使用这些组件在GCP VM实例上设置Kubernetes,甚至可以使用之前提到的kops工具。
综上所述,在GCP上部署Kubernetes涉及子网、防火墙规则、VM实例、负载均衡器和持久磁盘等多个方面的配置。通过合理配置这些组件,可以实现高效、安全的Kubernetes集群部署。
6. 进一步优化与扩展
6.1 自动伸缩
为了应对流量的变化,提高资源利用率,可以为实例组设置自动伸缩。以下是设置自动伸缩的步骤:
1. 确定伸缩策略 :可以根据CPU利用率、请求率等指标进行伸缩。
2. 配置自动伸缩器 :
# 为http-ig-us-west实例组配置自动伸缩,目标CPU利用率为70%
$ gcloud compute instance-groups managed set-autoscaling http-ig-us-west \
--zone us-west1-a \
--max-num-replicas 10 \
--min-num-replicas 2 \
--target-cpu-utilization 0.7
# 为http-ig-us-east实例组配置自动伸缩,目标CPU利用率为70%
$ gcloud compute instance-groups managed set-autoscaling http-ig-us-east \
--zone us-east1-c \
--max-num-replicas 10 \
--min-num-replicas 2 \
--target-cpu-utilization 0.7
# 为tomcat-ig-us-west实例组配置自动伸缩,目标CPU利用率为70%
$ gcloud compute instance-groups managed set-autoscaling tomcat-ig-us-west \
--zone us-west1-a \
--max-num-replicas 10 \
--min-num-replicas 2 \
--target-cpu-utilization 0.7
6.2 监控与日志
使用Google Cloud Monitoring和Logging可以监控资源的使用情况和应用程序的日志。
1. 启用监控 :在GCP控制台中,导航到“监控”部分,为VM实例和负载均衡器启用监控。
2. 设置日志收集 :使用Google Cloud Logging收集VM实例和应用程序的日志。可以通过以下命令查看日志:
# 查看public-on-subnet-a实例的系统日志
$ gcloud compute instances get-serial-port-output public-on-subnet-a --zone us-west1-a
6.3 安全加固
为了提高系统的安全性,可以采取以下措施:
1. 限制网络访问 :进一步细化防火墙规则,只允许必要的流量。
2. 更新系统和应用程序 :定期更新VM实例上的操作系统和应用程序,以修复安全漏洞。
3. 使用加密 :对持久磁盘和网络通信进行加密,保护数据安全。
7. 故障排除
在部署和使用过程中,可能会遇到各种问题,以下是一些常见问题的解决方法:
7.1 负载均衡器健康检查失败
如果负载均衡器的健康检查失败,可能是以下原因导致的:
1. 防火墙规则问题 :检查是否有防火墙规则阻止了健康检查的流量。
2. 应用程序故障 :登录到VM实例,检查应用程序是否正常运行。
3. 配置错误 :检查健康检查的配置是否正确。
7.2 VM实例无法连接
如果无法连接到VM实例,可能是以下原因导致的:
1. SSH密钥问题 :检查SSH密钥是否正确配置。
2. 防火墙规则问题 :检查是否有防火墙规则阻止了SSH连接。
3. 网络问题 :检查网络连接是否正常。
7.3 持久磁盘挂载问题
如果持久磁盘无法挂载,可能是以下原因导致的:
1. 磁盘格式化问题 :检查磁盘是否已正确格式化。
2. 挂载点问题 :检查挂载点是否正确配置。
3. 权限问题 :检查是否有足够的权限进行挂载操作。
8. 总结与展望
8.1 总结
通过以上步骤,我们完成了在GCP上部署Kubernetes的过程,包括子网、防火墙规则、VM实例、负载均衡器和持久磁盘的配置。同时,我们还介绍了自动伸缩、监控与日志、安全加固等优化措施,以及常见问题的故障排除方法。
8.2 展望
随着云计算和容器技术的不断发展,Kubernetes在GCP上的应用也将不断扩展。未来,可以考虑以下方面的发展:
1. 使用GKE原生功能 :充分利用Google Container Engine(GKE)的原生功能,如自动升级、自动修复等。
2. 集成其他GCP服务 :将Kubernetes与其他GCP服务,如Cloud Storage、Cloud SQL等集成,实现更强大的功能。
3. 探索多集群管理 :随着业务的发展,可能需要管理多个Kubernetes集群,可以探索使用工具如Anthos进行多集群管理。
流程总结
以下是在GCP上部署Kubernetes的整体流程:
graph LR
A[创建子网] --> B[设置防火墙规则]
B --> C[创建VM实例]
C --> D[设置负载均衡器]
D --> E[创建持久磁盘并挂载]
E --> F[设置自动伸缩、监控与日志等优化措施]
F --> G[故障排除]
操作步骤回顾
| 步骤 | 操作内容 |
|---|---|
| 1 | 创建子网,使用 gcloud compute networks subnets create 命令 |
| 2 | 设置防火墙规则,使用 gcloud compute firewall-rules create 命令 |
| 3 | 创建VM实例,使用 gcloud compute instances create 命令 |
| 4 | 设置负载均衡器,包括创建实例组、健康检查、后端服务、url-maps等 |
| 5 | 创建持久磁盘并挂载,使用 gcloud compute disks create 和 gcloud compute instances attach-disk 命令 |
| 6 | 设置自动伸缩,使用 gcloud compute instance-groups managed set-autoscaling 命令 |
| 7 | 启用监控与日志,在GCP控制台操作 |
| 8 | 安全加固,包括限制网络访问、更新系统和应用程序、使用加密等 |
| 9 | 故障排除,根据不同问题进行相应处理 |
通过以上的操作和优化,我们可以在GCP上构建一个高效、安全、可扩展的Kubernetes集群,满足不同业务的需求。在实际应用中,还可以根据具体情况进行进一步的调整和优化。
超级会员免费看
895

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



