如何在 Azure 上的 Kubernetes 上设置 letsencrypt?
How to setup letsencrypt on kubernetes on azure?
我正在学习 kubernetes 并尝试为我的网络应用设置 letsencrypt。
我已经从 amazon route 53 买了一个域名。我们就叫它 example.com
然后我去在 azure 中创建一个集群,安装所有需要的应用程序:
- 安装 helm
choco install kubernetes-helm
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
- 应用
deployment.yml
文件
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp1-deployment
spec:
replicas: 3
selector:
matchLabels:
app: myapp1
template:
metadata:
name: myapp1-pod
labels: # Dictionary
app: myapp1
spec:
containers: # List
- name: myapp1-container
image: stacksimplify/kubenginx:1.0.0
ports:
- containerPort: 80
- 应用
service.yml
apiVersion: v1
kind: Service
metadata:
name: myapp1-loadbalancer
labels:
app: myapp1
spec:
selector:
app: myapp1
ports:
- port: 80
targetPort: 80
- 应用
ingress.yml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: myapp-ingress-demo
annotations:
kubernetes.io/ingress.class: nginx
cert-manager.io/cluster-issuer: cluster-issuer-name
cert-manager.io/acme-challenge-type: http01
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: "example.com"
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: myapp1-loadbalancer
port:
number: 80
tls:
- hosts:
- example.com
secretName: secret-name
在 Azure 门户中,查找与您在开始时创建的集群相关联的 public IP。默认情况下,当创建一个 k8 集群时,azure 会创建一个 public ip 关联到这个集群。找找,去前端配置,记下ip。
运行下面这个命令,替换你已有的ip
# Use Helm to deploy an NGINX ingress controller
helm install ingress-nginx ingress-nginx/ingress-nginx
--set controller.replicaCount=2 \
--set controller.nodeSelector."beta\.kubernetes\.io/os"=linux \
--set defaultBackend.nodeSelector."beta\.kubernetes\.io/os"=linux \
--set controller.service.externalTrafficPolicy=Local \
--set controller.service.loadBalancerIP="YOUR IP"
9. If done correctly, you should have load balancer service running now. Verify it with kubernetes: `kubectl get svc`. Take note of this ip address for the load balancer
转到 Amazon Route 53 控制面板,为您在 ingress.yml
中拥有的域名添加一条记录,其中包含您在第 9 步中拥有的 IP 地址
祝您工作愉快:)
谢谢
我已经用关于如何生成结果的步骤更新了我的问题。感谢 SOF 的大力支持。希望如果有人 运行 再次遇到这个问题,他们知道如何正确配置它。
您遗漏了一些您可能需要做的小事,请尝试再次更新。
URL 集群问题不适用于您正在使用暂存的 Prod,我建议仅在任何情况下使用 prod URL 而不是暂存。
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-staging
spec:
acme:
server: https://acme-staging-v02.api.letsencrypt.org/directory
email: abc@abc.com
privateKeySecretRef:
name: letsencrypt-staging
solvers:
- http01:
ingress:
class: nginx
使用:https://acme-v02.api.letsencrypt.org/directory
第二个 :
您没有将您的秘密附加到入口,理想情况下它将存储您的 TLS 证书。
流程是怎样的,
cert-manager 获取证书并将其存储在 kubernetes 秘密中,在您的情况下,您在 [=41] 中提到的 letsencrypt-staging =]集群发行者.
这个秘密也应该附加到入口,这样当任何人访问端点入口时,将这个证书用于 HTTPS 流量。
完整参考示例:
apiVersion: cert-manager.io/v1alpha2
kind: ClusterIssuer
metadata:
name: cluster-issuer-name
namespace: development
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
email: harsh@example.com
privateKeySecretRef:
name: secret-name
solvers:
- http01:
ingress:
class: nginx-class-name
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx-class-name
cert-manager.io/cluster-issuer: cluster-issuer-name
nginx.ingress.kubernetes.io/rewrite-target: /
name: example-ingress
spec:
rules:
- host: sub.example.com
http:
paths:
- path: /api
backend:
serviceName: service-name
servicePort: 80
tls:
- hosts:
- sub.example.com
secretName: secret-name
在上面的例子中我在 ingress 中使用了 annotatino : cert-manager.io/cluster-issuer: cluster-issuer-name
它会触发 clusterissuer 在创建入口时生成证书,一旦创建证书,它将存储在 K8s 秘密中。因此,为了将 SSL/TLS 证书机密附加到入口,我在入口 YAML 的最后添加了 TLS 块。
如果您正在应用我建议的更改,则不需要创建这个
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: ssl-cert-staging
namespace: default
spec:
secretName: ssl-cert-staging
issuerRef:
name: letsencrypt-staging
kind: ClusterIssuer
dnsNames:
- example.com
cert-manager 将为您 auto-create,您也可以删除它,只需应用上面的示例代码段,对名称等进行一些小的更改。
我正在学习 kubernetes 并尝试为我的网络应用设置 letsencrypt。
我已经从 amazon route 53 买了一个域名。我们就叫它 example.com
然后我去在 azure 中创建一个集群,安装所有需要的应用程序:
- 安装 helm
choco install kubernetes-helm
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
- 应用
deployment.yml
文件
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp1-deployment
spec:
replicas: 3
selector:
matchLabels:
app: myapp1
template:
metadata:
name: myapp1-pod
labels: # Dictionary
app: myapp1
spec:
containers: # List
- name: myapp1-container
image: stacksimplify/kubenginx:1.0.0
ports:
- containerPort: 80
- 应用
service.yml
apiVersion: v1
kind: Service
metadata:
name: myapp1-loadbalancer
labels:
app: myapp1
spec:
selector:
app: myapp1
ports:
- port: 80
targetPort: 80
- 应用
ingress.yml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: myapp-ingress-demo
annotations:
kubernetes.io/ingress.class: nginx
cert-manager.io/cluster-issuer: cluster-issuer-name
cert-manager.io/acme-challenge-type: http01
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: "example.com"
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: myapp1-loadbalancer
port:
number: 80
tls:
- hosts:
- example.com
secretName: secret-name
在 Azure 门户中,查找与您在开始时创建的集群相关联的 public IP。默认情况下,当创建一个 k8 集群时,azure 会创建一个 public ip 关联到这个集群。找找,去前端配置,记下ip。
运行下面这个命令,替换你已有的ip
# Use Helm to deploy an NGINX ingress controller
helm install ingress-nginx ingress-nginx/ingress-nginx
--set controller.replicaCount=2 \
--set controller.nodeSelector."beta\.kubernetes\.io/os"=linux \
--set defaultBackend.nodeSelector."beta\.kubernetes\.io/os"=linux \
--set controller.service.externalTrafficPolicy=Local \
--set controller.service.loadBalancerIP="YOUR IP"
9. If done correctly, you should have load balancer service running now. Verify it with kubernetes: `kubectl get svc`. Take note of this ip address for the load balancer
转到 Amazon Route 53 控制面板,为您在
中拥有的域名添加一条记录,其中包含您在第 9 步中拥有的 IP 地址ingress.yml
祝您工作愉快:)
谢谢
我已经用关于如何生成结果的步骤更新了我的问题。感谢 SOF 的大力支持。希望如果有人 运行 再次遇到这个问题,他们知道如何正确配置它。
您遗漏了一些您可能需要做的小事,请尝试再次更新。
URL 集群问题不适用于您正在使用暂存的 Prod,我建议仅在任何情况下使用 prod URL 而不是暂存。
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-staging
spec:
acme:
server: https://acme-staging-v02.api.letsencrypt.org/directory
email: abc@abc.com
privateKeySecretRef:
name: letsencrypt-staging
solvers:
- http01:
ingress:
class: nginx
使用:https://acme-v02.api.letsencrypt.org/directory
第二个 :
您没有将您的秘密附加到入口,理想情况下它将存储您的 TLS 证书。
流程是怎样的,
cert-manager 获取证书并将其存储在 kubernetes 秘密中,在您的情况下,您在 [=41] 中提到的 letsencrypt-staging =]集群发行者.
这个秘密也应该附加到入口,这样当任何人访问端点入口时,将这个证书用于 HTTPS 流量。
完整参考示例:
apiVersion: cert-manager.io/v1alpha2
kind: ClusterIssuer
metadata:
name: cluster-issuer-name
namespace: development
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
email: harsh@example.com
privateKeySecretRef:
name: secret-name
solvers:
- http01:
ingress:
class: nginx-class-name
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx-class-name
cert-manager.io/cluster-issuer: cluster-issuer-name
nginx.ingress.kubernetes.io/rewrite-target: /
name: example-ingress
spec:
rules:
- host: sub.example.com
http:
paths:
- path: /api
backend:
serviceName: service-name
servicePort: 80
tls:
- hosts:
- sub.example.com
secretName: secret-name
在上面的例子中我在 ingress 中使用了 annotatino : cert-manager.io/cluster-issuer: cluster-issuer-name
它会触发 clusterissuer 在创建入口时生成证书,一旦创建证书,它将存储在 K8s 秘密中。因此,为了将 SSL/TLS 证书机密附加到入口,我在入口 YAML 的最后添加了 TLS 块。
如果您正在应用我建议的更改,则不需要创建这个
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: ssl-cert-staging
namespace: default
spec:
secretName: ssl-cert-staging
issuerRef:
name: letsencrypt-staging
kind: ClusterIssuer
dnsNames:
- example.com
cert-manager 将为您 auto-create,您也可以删除它,只需应用上面的示例代码段,对名称等进行一些小的更改。