导读

本文描述了两种场景下,申请Let’s Encrypt证书的途径:

  1. 云服务器中,通过K8S集群中部署cert-manager来申请,这种方式下,您需要具备如下条件:
  • 具备独立公网IP资源的K8S集群(比如公有云服务器上运行的K8S集群)
  • K8S集群已经安装了Ingress控制器
  • 服务器已经安装了helm
  • 一个域名,且指向该公网IP
  • 对于国内服务器,域名已经备案(如果没有备案,将不能通过cert-manager申请证书)
  1. 在云服务器中,通过安装certbot来申请证书,这种方式下,您需要具备如下条件:
  • 具备独立公网IP资源的云服务器(本文的脚本为centos 7.x适用的脚本)
  • 一个域名,且指向该公网IP
  • 对于国内服务器,域名已经备案

安装的详细步骤建议参考官网的文档。本文中的具体配置供参考。

方式一:通过在K8S集群中部署cert-manager申请

通过helm安装

执行以下命令安装(详情参见官网)

helm repo add jetstack https://charts.jetstack.io
helm repo update
helm install \cert-manager jetstack/cert-manager \--namespace cert-manager \--create-namespace \--version v1.8.0 \--set installCRDs=true

安装完成后,通过部署一个测试的Issuer,并签发证书进行测试,也可以通过安装cmctl测试(详情参见官网)

cat <<EOF > test-resources.yaml
apiVersion: v1
kind: Namespace
metadata:name: cert-manager-test
---
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:name: test-selfsignednamespace: cert-manager-test
spec:selfSigned: {}
---
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:name: selfsigned-certnamespace: cert-manager-test
spec:dnsNames:- example.comsecretName: selfsigned-cert-tlsissuerRef:name: test-selfsigned
EOFkubectl apply -f test-resources.yaml
kubectl describe certificate -n cert-manager-test

创建ACME方式的ClusterIssuer

通过如下命令创建ClusterIssuer(集群级的证书签发机构):

cat << __EOF__ > clusterissuer.yaml
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:name: letsencrypt-prod
spec:acme:server: https://acme-v02.api.letsencrypt.org/directorypreferredChain: "ISRG Root X1"email: <your email>privateKeySecretRef:name: <Cluster Issuer Secret Name>solvers:    - http01:ingress:name: <Exist Ingress Name>
__EOF__kubectl apply -f clusterissuer.yaml

在上述例子中,solver表示可以完成Challenge(Challenge即证书签发机构要求你完成的一项任务,即证明你对域名拥有控制权)的资源。ACME的Challenge分为两种:

  • http01:提供一个可以通过域名访问的web服务,证明你拥有该域名
  • dns01: 查询域名信息时,能够获得指定的DNS TXT记录,证明你拥有该域名

我们使用http01这种方式。
配置http01 solver时,我们通过下列配置指定现有的ingress:

    - http01:ingress:name: <Exist Ingress Name>

此时,cert-manager会编辑该Ingress,以使证书签发机构的查询流量走到我们集群内部的solver pod中。

签发证书

安装完后,部署下面的资源签发证书:

apiVersion: cert-manager.io/v1
kind: Certificate
metadata:name: my-certificate
spec:secretName: my-certificate-tlsissuerRef:name: letsencrypt-prod # Same to the name of the cluster issuerkind: ClusterIssuerdnsNames:- <your domain>

通过以下命令查看签发的证书是否成功:

kubectl get certificate

如果签发证书不成功,可以根据官网FAQ进行排查。
如果在cert-manager的pod中遇到下面类似的错误,可能是因为域名没有备案:

sync.go:386 cert-manager/challenges/acceptChallenge "msg"="error waiting for authorization" "error"="acme: authorization error for t.sharework.cn: 403 urn:ietf:params:acme:error:unauthorized: : Invalid response from https://dnspod.qcloud.com/static/webblock.html?d=<your domain>: \"

Let’s Encrypt现委托qcloud.com进行域名查询,如果您的域名尚未备案,将得到上述错误。

方式二:通过安装certbot申请

您也可以直接通过安装certbot来进行申请,假设您拥有云服务器,并且在服务器创建时执行了以下脚本(按需要修改前三项参数):

#!/bin/sh
CERT_DOMAIN="your.domain"
CERT_EMAIL="your email"
ROOT_PASSWORD="<root password>"# Ensure centos-release installedif test -z $(rpm -qa centos-release); thenyum install -y centos-release
fi
basearch=$(arch)
releasever=$(rpm -q --qf %{version} centos-release)# Setup nginxif test -z "$(rpm -qa nginx)"; thencat << __EOF__ > /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1
module_hotfixes=true
__EOF__REFRESH_INSTALL="y"yum install -y nginxsystemctl start nginx.servicesystemctl enable nginx.service
elseREFRESH_INSTALL="n"systemctl restart nginx.servicesystemctl enable nginx.service
fi# Setup snapdyum install -y snapd
systemctl restart snapd.service
systemctl enable snapd
snap install core
snap refresh core
if test ! -d /snap; thenln -s -d /var/lib/snapd/snap /snap
fi# Setup certbotsnap install --classic certbot
if test ! -f /usr/bin/certbot; thenln -s /snap/bin/certbot /usr/bin/certbot
fi# Enable port 80 and 443if test ! -z "$(firewall-cmd --state | grep -e "^running")"; thenFIREWALL_POLICY_ADDED=""if test -z "$(firewall-cmd --list-ports | tr ' ' '\n'|sed 's/[ ]//g' | grep "80/tcp")"; thenfirewall-cmd --permanent --add-port=80/tcpFIREWALL_POLICY_ADDED="80"fiif test -z "$(firewall-cmd --list-ports | tr ' ' '\n'|sed 's/[ ]//g' | grep "443/tcp")"; thenfirewall-cmd --permanent --add-port=443/tcpFIREWALL_POLICY_ADDED=$FIREWALL_POLICY_ADDED"443"fiif test ! -z "$FIREWALL_POLICY_ADDED"; thenfirewall-cmd --reloadfi
ficat << __EOF__ > /etc/nginx/conf.d/default.conf
server {listen 80;server_name  localhost $CERT_DOMAIN;location / {root   /usr/share/nginx/html;index  index.html index.htm;}error_page   500 502 503 504  /50x.html;location = /50x.html {root   /usr/share/nginx/html;}
}
__EOF__# Restart Nginx to accept the new domainsystemctl restart nginx.service# change root password
echo $ROOT_PASSWORD | passwd --stdin rootcat << __EOF__ >> /etc/profile
echo "Certbot Server"
echo "=============="
echo "You can request certificate by following steps(<IP> is the IP address of THIS VPS) : "
echo ""
echo "1. Setup DNS A record, bind the domain to the <IP>"
echo "2. certbot run --nginx -n --email $CERT_EMAIL -d $CERT_DOMAIN --agree-tos"
echo "3. cd to a proper local directory"
echo "4. scp -r root@<IP>:{/etc/letsencrypt/live/$CERT_DOMAIN,/etc/letsencrypt/options-ssl-nginx.conf,/etc/letsencrypt/ssl-dhparams.pem,/etc/nginx/conf.d/default.conf} ."
echo ""
echo "You can find certificates in sub folder $CERT_DOMAIN, besides with nginx configuration files."
__EOF__

服务器启动后,您可以登录服务器并按照上面的提示进行证书申请。

为K8S集群申请Let‘s Encrypt证书相关推荐

  1. openssl命令查看证书有效期_kubeadm初始化k8s集群延长证书过期时间

    前言 kubeadm初始化k8s集群,签发的CA证书有效期默认是10年,签发的apiserver证书有效期默认是1年,到期之后请求apiserver会报错,使用openssl命令查询相关证书是否到期. ...

  2. Rancher RKE K8s 集群 etcd 恢复

    背景 在 Rancher 中基于 RKE 创建的 K8s 集群,因为服务器磁盘故障,导致 3个 master 节点有2个节点的 etcd 数据文件损坏,导致整个集群不可用. etcd 三个节点集群时, ...

  3. 3、使用二进制方式搭建K8S集群

    文章目录 一.安装要求 二.准备环境 三.系统初始化配置 四.部署 Etcd 集群 4.1 准备 cfssl 证书生成工具 4.2 生成 Etcd 证书 4.3 从 Github 下载二进制文件 4. ...

  4. 【深度】阿里巴巴万级规模 K8s 集群全局高可用体系之美

    作者 |  韩堂.柘远.沉醉 来源 | 阿里巴巴云原生公众号 ​ 前言 台湾作家林清玄在接受记者采访的时候,如此评价自己 30 多年写作生涯:"第一个十年我才华横溢,'贼光闪现',令周边黯然 ...

  5. 【深度探讨】阿里巴巴万级规模 K8s 集群全局高可用体系之美

    简介:台湾作家林清玄在接受记者采访的时候,如此评价自己 30 多年写作生涯:"第一个十年我才华横溢,'贼光闪现',令周边黯然失色:第二个十年,我终于'宝光现形',不再去抢风头,反而与身边的美 ...

  6. 万级K8s集群背后etcd稳定性及性能优化实践

    作者:唐聪, 腾讯 CSIG 后台开发工程师 本文旨在帮助大家了解 etcd集群场景下稳定性与性能优化经验引的容量,避免给后面留坑. 背景与挑战 随着腾讯自研上云及公有云用户的迅速增长,一方面,腾讯云 ...

  7. 在sealos搭建的k8s集群中自定义kubeconfig文件

    推荐阅读 Helm3(K8S 资源对象管理工具)视频教程:https://edu.csdn.net/course/detail/32506 Helm3(K8S 资源对象管理工具)博客专栏:https: ...

  8. [k8s]jenkins配合kubernetes插件实现k8s集群构建的持续集成

    另一个结合harbor自动构建镜像的思路: 即code+baseimage一体的方案 - 程序员将代码提交到代码仓库gitlab - 钩子触发jenkins master启动一次构建 - jenkin ...

  9. 来了,k8s!-----------------k8s集群部署

    k8s的集群部署,官方提供了三种方式: minikube Minikube是一个工具,可以在本地快速运行的一个单点的k8s,仅用于尝试k8s或日常开发的用户使用.部署地址:https://kubern ...

最新文章

  1. Tomcat详解(下)
  2. oracle函数查询数据字典
  3. 关于Ubuntu16.04下安装VMwareTools失败,未发现软件包open-vm-dkms,open-vm-tools问题解决
  4. php函数get和set,php中外部类调用_get函数和_set函数的方法
  5. 【算法竞赛学习】学术前沿趋势-论文作者统计
  6. 空间谱专题11:子阵平滑与秩亏缺
  7. [Catalan]求解随机出栈可能数(洛谷P1044题题解,Java语言描述)
  8. Response.IsClientConnected
  9. 关于Mytatis动态拼接in语句并且按照指定顺序排序的问题
  10. SpringBoot 嵌入式web容器的启动原理
  11. 九、Linux 软件包安装
  12. 初识kmp算法(呕心沥血之文----看视频+总结)
  13. C++字符读入函数(getchgetchar)
  14. 麻省理工学院(MIT)发明漏洞自动修复系统
  15. MAC: docker compose mount permission denied 挂载失败
  16. vivoX30是android5的吗,深度剖析揭秘opporeno5质量和vivox30区别是?选哪个更好?独家揭秘报道...
  17. 没有免费用户却飞速发展,Uber技术栈全解析!
  18. Flutter FloatingActionButton 及仿闲鱼的发布按钮
  19. pandoc下载 - 文档格式转换器
  20. 理解Linux中的进程状态

热门文章

  1. SQL入门之第二一讲——IF函数的使用
  2. 用python搭建 百万答题 、自动百度搜索答案
  3. 搜索引擎如何判定站群是否作弊?
  4. 研究生联系导师需要注意什么
  5. .browser的解释
  6. 有没有视频合并软件?合并视频这样做
  7. AST反混淆实战:猿人学爬虫比赛第二题详细题解
  8. 记录一道已知是n,(p-1)*(q-2)和(p-2)*(q-1)的RSA题目writeup
  9. SafeIterableMap
  10. java体系的中间件适用于go吗,Go语言经典库使用分析(五)| Negroni 中间件(一)...