我有一个简单的Web服务器在GKE的Kubernetes上公开公开,并注册了一个域。我正在为此添加TLS,以便可以通过HTTPS访问它。我听说过很多有关使用“让我们加密”的信息,但最终尝试了以下操作:https://github.com/jetstack/cert-manager/blob/master/docs/tutorials/acme/quick-start/index.rst,但发现它完全让人不知所措。假设我的部署只是单个服务和pod,是否有使用“加密”的更简单方法?
我正在使用的配置是:
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
labels:
app: web
spec:
replicas: 1
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: web
image: gcr.io/my-repo
ports:
- containerPort: 8080
livenessProbe:
httpGet:
path: /healthz
port: 8080
readinessProbe:
initialDelaySeconds: 10
httpGet:
path: /healthz
port: 8080
---
apiVersion: v1
kind: Service
metadata:
name: web-balancer-service
spec:
ports:
- port: 8080
protocol: TCP
targetPort: 8080
selector:
run: web
type: NodePort
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: my-ingress-app
spec:
rules:
- host: my.domain.com
http:
paths:
- path: /*
backend:
serviceName: web-balancer-service
servicePort: 8080
======================================
编辑:按照@UtkuÖzdemir的建议,我尝试将这些更改编入YAML。我使用
创建了IP地址gcloud compute addresses create example-ip-address --global
证书以及以下项的设置:https://gist.github.com/nickponline/ab74d3d179e21474551b7596c6478eea
一切准备都正确,但是当我用kubectl describe ManagedCertificates example-certificate
检查ManagedCertificates时说
Spec:
Domains:
app.domain.xyz
Status:
Certificate Name: xxxxxxxxxxxxxxxxxx
Certificate Status: Provisioning
Domain Status:
Domain: app.domain
Status: FailedNotVisible
Events: <none>
我已经等了24小时,所以假设情况不会改变。
答案 0 :(得分:2)
由于您使用GKE本身的入口控制器,因此在创建 Ingress 资源时,它将触发在Google Cloud Platform中创建 Load Balancer 资源。通常,SSL终止是入口控制器的责任,因此GCP负载平衡器负责SSL终止。
这意味着,cert-manager不适用于您的情况,因为证书将驻留在您的群集之外,并且流量在进入您的群集之前已经被SSL终止。
幸运的是,GCP具有自我配置的SSL(Let's Encrypt)支持。要利用它,您需要按照以下步骤操作:
转到GCP上的“负载平衡”屏幕,切换到高级视图,然后跳到“证书”选项卡(或只需单击here)。
创建一个新的SSL证书,并选择“创建Google管理的证书”。在域字段中,写下您想要SSL证书的确切域。它应该看起来像这样:
34.95.84.106
)转到您的域注册商,并为您的域添加一个A
类型的记录(SSL证书中的记录)以指向您分配的静态IP。在此示例中,它将为my-app.example.com -> 34.95.84.106
。
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: my-ingress-app
annotations:
ingress.gcp.kubernetes.io/pre-shared-cert: my-ssl-certificate # the name of the SSL certificate resource you created
kubernetes.io/ingress.global-static-ip-name: my-static-ip # the name of the static ip resource you created
kubernetes.io/ingress.allow-http: "false" # if you want to block plain http
spec:
rules:
- host: my-app.example.com
http:
paths:
- path: /*
backend:
serviceName: web-balancer-service
servicePort: 8080
应用它,并通过转到GCP上的“负载平衡器”屏幕来验证更改是否得到反映。
如果某个入口已经创建了GCP负载平衡器,则您在入口上所做的更改(注释)将不会反映到现有的负载平衡器上。因此,请删除您现有的入口,确保现有的负载均衡器消失,并使用正确的注释创建该入口,以便正确配置负载均衡器。
为使“让我们加密”设置生效,您的DNS记录应该存在。在颁发证书之前,它将使用DNS检查域的所有者。另外,最初的配置可能会花费一些时间(最多半小时)。