为K8S集群申请Let‘s Encrypt证书
导读
本文描述了两种场景下,申请Let’s Encrypt证书的途径:
- 云服务器中,通过K8S集群中部署cert-manager来申请,这种方式下,您需要具备如下条件:
- 具备独立公网IP资源的K8S集群(比如公有云服务器上运行的K8S集群)
- K8S集群已经安装了Ingress控制器
- 服务器已经安装了helm
- 一个域名,且指向该公网IP
- 对于国内服务器,域名已经备案(如果没有备案,将不能通过cert-manager申请证书)
- 在云服务器中,通过安装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证书相关推荐
- openssl命令查看证书有效期_kubeadm初始化k8s集群延长证书过期时间
前言 kubeadm初始化k8s集群,签发的CA证书有效期默认是10年,签发的apiserver证书有效期默认是1年,到期之后请求apiserver会报错,使用openssl命令查询相关证书是否到期. ...
- Rancher RKE K8s 集群 etcd 恢复
背景 在 Rancher 中基于 RKE 创建的 K8s 集群,因为服务器磁盘故障,导致 3个 master 节点有2个节点的 etcd 数据文件损坏,导致整个集群不可用. etcd 三个节点集群时, ...
- 3、使用二进制方式搭建K8S集群
文章目录 一.安装要求 二.准备环境 三.系统初始化配置 四.部署 Etcd 集群 4.1 准备 cfssl 证书生成工具 4.2 生成 Etcd 证书 4.3 从 Github 下载二进制文件 4. ...
- 【深度】阿里巴巴万级规模 K8s 集群全局高可用体系之美
作者 | 韩堂.柘远.沉醉 来源 | 阿里巴巴云原生公众号 前言 台湾作家林清玄在接受记者采访的时候,如此评价自己 30 多年写作生涯:"第一个十年我才华横溢,'贼光闪现',令周边黯然 ...
- 【深度探讨】阿里巴巴万级规模 K8s 集群全局高可用体系之美
简介:台湾作家林清玄在接受记者采访的时候,如此评价自己 30 多年写作生涯:"第一个十年我才华横溢,'贼光闪现',令周边黯然失色:第二个十年,我终于'宝光现形',不再去抢风头,反而与身边的美 ...
- 万级K8s集群背后etcd稳定性及性能优化实践
作者:唐聪, 腾讯 CSIG 后台开发工程师 本文旨在帮助大家了解 etcd集群场景下稳定性与性能优化经验引的容量,避免给后面留坑. 背景与挑战 随着腾讯自研上云及公有云用户的迅速增长,一方面,腾讯云 ...
- 在sealos搭建的k8s集群中自定义kubeconfig文件
推荐阅读 Helm3(K8S 资源对象管理工具)视频教程:https://edu.csdn.net/course/detail/32506 Helm3(K8S 资源对象管理工具)博客专栏:https: ...
- [k8s]jenkins配合kubernetes插件实现k8s集群构建的持续集成
另一个结合harbor自动构建镜像的思路: 即code+baseimage一体的方案 - 程序员将代码提交到代码仓库gitlab - 钩子触发jenkins master启动一次构建 - jenkin ...
- 来了,k8s!-----------------k8s集群部署
k8s的集群部署,官方提供了三种方式: minikube Minikube是一个工具,可以在本地快速运行的一个单点的k8s,仅用于尝试k8s或日常开发的用户使用.部署地址:https://kubern ...
最新文章
- Tomcat详解(下)
- oracle函数查询数据字典
- 关于Ubuntu16.04下安装VMwareTools失败,未发现软件包open-vm-dkms,open-vm-tools问题解决
- php函数get和set,php中外部类调用_get函数和_set函数的方法
- 【算法竞赛学习】学术前沿趋势-论文作者统计
- 空间谱专题11:子阵平滑与秩亏缺
- [Catalan]求解随机出栈可能数(洛谷P1044题题解,Java语言描述)
- Response.IsClientConnected
- 关于Mytatis动态拼接in语句并且按照指定顺序排序的问题
- SpringBoot 嵌入式web容器的启动原理
- 九、Linux 软件包安装
- 初识kmp算法(呕心沥血之文----看视频+总结)
- C++字符读入函数(getchgetchar)
- 麻省理工学院(MIT)发明漏洞自动修复系统
- MAC: docker compose mount permission denied 挂载失败
- vivoX30是android5的吗,深度剖析揭秘opporeno5质量和vivox30区别是?选哪个更好?独家揭秘报道...
- 没有免费用户却飞速发展,Uber技术栈全解析!
- Flutter FloatingActionButton 及仿闲鱼的发布按钮
- pandoc下载 - 文档格式转换器
- 理解Linux中的进程状态
热门文章
- SQL入门之第二一讲——IF函数的使用
- 用python搭建 百万答题 、自动百度搜索答案
- 搜索引擎如何判定站群是否作弊?
- 研究生联系导师需要注意什么
- .browser的解释
- 有没有视频合并软件?合并视频这样做
- AST反混淆实战:猿人学爬虫比赛第二题详细题解
- 记录一道已知是n,(p-1)*(q-2)和(p-2)*(q-1)的RSA题目writeup
- SafeIterableMap
- java体系的中间件适用于go吗,Go语言经典库使用分析(五)| Negroni 中间件(一)...