我正在is-central1-b us-central-1-c和us-centrall-f中运行一个区域性GKE kubernetes集群。我跑了1.21.14公斤。我使用此命令将一个机密节点池添加到集群中。
gcloud container node-pools create card-decrpyt-confidential-pool-1
--cluster=svcs-dev-1
--disk-size=100GB
--disk-type=pd-standard
--enable-autorepair
--enable-autoupgrade
--enable-gvnic
--image-type=COS_CONTAINERD
--machine-type="n2d-standard-2"
--max-pods-per-node=8
--max-surge-upgrade=1
--max-unavailable-upgrade=1
--min-nodes=4
--node-locations=us-central1-b,us-central1-c,us-central1-f
--node-taints=dedicatednode=card-decrypt:NoSchedule
--node-version=1.21.14-gke.700
--num-nodes=4
--region=us-central1
--sandbox="type=gvisor"
--scopes=https://www.googleapis.com/auth/cloud-platform
--service-account="card-decrpyt-confidential@corp-dev-project.iam.gserviceaccount.com"
--shielded-integrity-monitoring
--shielded-secure-boot
--tags=testingdonotuse
--workload-metadata=GKE_METADATA
--enable-confidential-nodes
这会创建一个节点池,但有一个问题。。。我仍然可以SSH到节点池创建的实例。这对于我的用例来说是不可接受的,因为这些节点池需要尽可能安全。我进入我的节点池,使用一个基于为我的节点库创建的实例模板创建了一个关闭ssh的新机器模板。
gcloud compute instance-templates create card-decrypt-instance-template
--project=corp-dev-project
--machine-type=n2d-standard-2
--network-interface=aliases=gke-svcs-dev-1-pods-10a0a3cd:/28,nic-type=GVNIC,subnet=corp-dev-project-private-subnet,no-address
--metadata=block-project-ssh-keys=true,enable-oslogin=true
--maintenance-policy=TERMINATE --provisioning-model=STANDARD
--service-account=card-decrpyt-confidential@corp-dev-project.iam.gserviceaccount.com
--scopes=https://www.googleapis.com/auth/cloud-platform
--region=us-central1 --min-cpu-platform=AMD Milan
--tags=testingdonotuse,gke-svcs-dev-1-10a0a3cd-node
--create-disk=auto-delete=yes,boot=yes,device-name=card-decrpy-instance-template,image=projects/confidential-vm-images/global/images/cos-89-16108-766-5,mode=rw,size=100,type=pd-standard
--shielded-secure-boot
--shielded-vtpm -
-shielded-integrity-monitoring
--labels=component=gke,goog-gke-node=,team=platform --reservation-affinity=any
当我更改节点池中节点的实例模板时,新实例会联机,但它们不会附加到节点池。集群总是试图自我修复,在删除池中的所有节点之前,我无法更改任何设置。我没有收到任何错误。
我需要做些什么来禁用ssh到具有我创建的原始节点池或新实例模板的节点池节点中。我已经尝试了一系列不同的配置,包括新的节点池和集群,但没有任何运气。我尝试过不同的标签网络配置和图像。这些都没有奏效。
其他信息:该群集最初不是机密群集。机密节点是第一个添加到集群中的此类节点。
这里的一个选项是为集群中的节点启用专用IP地址。--enable-private-nodes
标志将使集群中的节点获得私有IP地址(而不是默认的公共、面向互联网的IP地址(。
请注意,在这种情况下,您仍然可以通过SSH连接到这些节点,但只能从VPC网络中连接。
请注意,这意味着您将无法从VPC网络之外访问NodePort
类型的服务。相反,您需要使用LoadBalancer
类型的服务(或者如果需要,提供一些其他方式将流量从集群外部路由到您的服务(。
如果您想阻止SSH访问,即使是在您的VPC网络中,您最简单的选择可能是配置防火墙规则来拒绝SSH流量到您的节点(TCP/UDP/SCTP端口22(。使用网络标签(--tags
标志(以GKE节点为目标。
大致如下:
gcloud compute firewall-rules create fw-d-i-ssh-to-gke-nodes
--network NETWORK_NAME
--action deny
--direction ingress
--rules tcp:22,udp:22,sctp:22
--source-ranges 0.0.0.0/0
--priority 65534
--target-tags my-gke-node-network-tag
最后,我要提到的最后一个创建强化GKE集群的选项是使用Google的safer-cluster
Terraform模块。这是一个有主见的GKE集群设置,遵循了谷歌集群强化指南中列出的许多原则,Terraform模块处理了这里的许多细节样板。
创建节点池时需要元数据标志--metadata=块项目ssh密钥=TRUE\
这阻止了ssh。但是,enable-os-login=false不起作用,因为它是为Kubernetes引擎保留的