Ingress-Nginx 是一个为 K8s 官方集成的服务网关,主要用于对集群中 Http 或 Https 服务的外部访问的 API 对象,以及提供负载平衡、SSL 终端和基于名称的虚拟主机。
目录
1.集群部署拓扑图
2.应用服务发布的方式
3.Http(s) 服务网关(Ingress-Nginx 插件)部署
4.Http 服务发布
5.Https 服务发布
-- 5.1.制作虚拟主机证书
---- 5.1.1.第一阶段:制作 CA 根证书
---- 5.1.2.第二阶段:制作服务器证书
---- 5.1.3.第三阶段:制作客户端证书(双向认证使用)
-- 5.2.Https 服务发布
-- 5.3.Https 服务发布(双向认证)
-- 5.4.客户端配置
---- 5.4.1.安装 CA 机构证书
---- 5.4.2.安装客户端 PKCS12 证书(双向认证使用)
1.部署拓扑图
网络资源规划:
1、Master 主控节点
- 主机名:k8s-master
- IP:192.168.0.20
- 程序:kube-apiserver,kube-controllermanager,kube-scheduler
- 操作系统:CentOS8
2、Node 工作节点
节点名 | 主机名 | IP 地址 | 程序 | 操作系统 |
---|---|---|---|---|
工作节点-1 | k8s-node1 | 192.168.0.31 | kubelet,kube-proxy,docker | CentOS8 |
工作节点-2 | k8s-node2 | 192.168.0.32 | kubelet,kube-proxy,docker | CentOS8 |
工作节点≥3 | k8s-node3 | 192.168.0.33 | kubelet,kube-proxy,docker | CentOS8 |
3、Etcd 节点
节点名 | 主机名 | IP 地址 | 程序 | 操作系统 |
---|---|---|---|---|
Etcd 节点-1 | k8s-etcd1 | 192.168.0.41 | etcd | CentOS8 |
Etcd 节点-2 | k8s-etcd2 | 192.168.0.42 | etcd | CentOS8 |
Etcd 节点≥3 | k8s-etcd3 | 192.168.0.43 | etcd | CentOS8 |
4、SSL 证书服务器
- 主机名:k8s-ssl
- IP:192.168.0.50
- 程序:CFSSL,OpenSSL
- 操作系统:CentOS8
5、K8s 集群网络
- Service 子网 IP 段:10.0.0.0/16。用于为 Pod 中发布的服务自动分配 IP 地址。
- CNI 子网 IP 段:10.254.0.0/16。用于为 Pod 中部署的容器自动分配 IP 地址。
6、 在集群中部署了一个名为 "web" 的 Nginx 服务。
[centos@k8s-master ~]$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
web NodePort 10.0.104.29 80:32660/TCP 2d18h
2.应用服务发布的方式
以 web 服务为例,应用服务通常通过以下方式发布:
1、通过 ClusterIP 访问 Service。
部署 Service 时,声明 "port: 80"(内部服务端口号) 属性。
通过动态分配的内部 IP 地址和已声明的内部端口号访问应用服务,如:【http://10.0.104.29:80】。
这种方式仅能用于在 Node 工作节点宿主机和 Pod 容器访问服务。
2、通过 NodePort 访问 Service。
部署 Service 时,声明 "nodePort: 32660"(宿主机暴露口号) 属性。
通过所有 Node 工作节点宿主机的 IP 地址和已定义的暴露端口号访问应用,如:【http://192.168.0.31(32/33):32660】任意地址均可,外部端口号可以在 YAML 文件中声明为静态端口,也可以不声明使用随机端口。
这种方式可以被 Node 工作节点所在网络中的任何主机访问服务。
3、通过宿主机网络直接访问 Pod 容器(不常用,仅用于特定场景)。
部署 Pod 时,声明 "hostNetwork: true"(使用宿主机网络) 和 "containerPort: 80" (容器开放端口号)属性。通常采用这种方式部署 Pod 后,不需要再部署 Service 。
通过 Pod 容器所在的 Node 工作节点宿主机的 IP 地址和开放端口号访问应用,如:假设该 Pod 容器部署在 IP 地址为 "192.168.0.31" 的 Node 工作节点上,且该容器开放了 "80" 端口,则通过【http://192.168.0.31:80】访问服务。
这种方式可以被 Node 工作节点所在网络中的任何主机访问服务。
4、通过 Ingress 访问 Http 或 Https 协议的 Service。
Ingress 实现通过虚拟主机的方式访问 Http 或 Https 服务,在部署 Ingress 时,需要声明该服务的主机头(域名)和内部服务的名称、端口号。
通过 Ingress 域名访问应用,如:【http://ingress .web】。
这种方式可以被 Node 工作节点所在网络中的任何主机(该主机配置的 DNS 服务需要能够解析 Ingress 声明的域名)访问服务。
3.Http(s) 服务网关(Ingress-Nginx 插件)部署
使用 Ingress-Nginx 插件实现 K8s 的 Ingress 服务网关。在任意一个 Master 主控节点上执行以下操作步骤:
1、打开 Ingress-Nginx 下载页面【https://github.com/kubernetes/ingress-nginx】,下载 Ingress-Nginx 配置文件到 K8s Server 的配置目录。
1)打开 Flannel 下载页面,查询配置文件下载地址:
2)下载配置文件到 K8s Server 的配置目录。**
[centos@k8s-master ~]$ sudo wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/mandatory.yaml -O /usr/local/kubernetes/server/etc/kube-ingress-nginx.yaml
2、验证配置文件 "kube-ingress-nginx.yml"(一般使用默认配置即可)。
使用文本编辑器打开 "/usr/local/kubernetes/server/etc/kube-ingress-nginx.yml":
[centos@k8s-master ~]$ sudo gedit /usr/local/kubernetes/server/etc/kube-ingress-nginx.yaml
验证 Ingress-Nginx 镜像:
apiVersion: apps/v1
# kind: Deployment,修改为:DaemonSet。
# DaemonSet 类型的镜像会在所有的 Node 工作节点中部署。
kind: DaemonSet
...
spec:
# Pod 扩(缩)容数量,当 Kind 修改为 “DaemonSet” 时,此属性不适用,注释或删除改属性。
# replicas: 1
...
template:
...
spec:
...
# 增加 hostNetwork 属性并设置为 true。表示使用宿主机的网络空间,设置为 false 或不设置表示使用容器内部的网络空间。
hostNetwork: true
containers:
- name: nginx-ingress-controller
image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.30.0
# 定义的参数
args:
- /nginx-ingress-controller
- --configmap=$(POD_NAMESPACE)/nginx-configuration
- --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
- --udp-services-configmap=$(POD_NAMESPACE)/udp-services
- --publish-service=$(POD_NAMESPACE)/ingress-nginx
- --annotations-prefix=nginx.ingress.kubernetes.io
...
# 定义的参数中的变量值
env:
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
# 容器开放的端口名称、端口号和协议,允许多个
ports:
- name: http
containerPort: 80
protocol: TCP
- name: https
containerPort: 443
protocol: TCP
...
注意:
部署后,Node 工作节点会检查本地节点是否已存在镜像,如果不存在则会自动从 Docker Hub 中下载镜像。如果部署在互联网中,由于国外的 Docker Hub 限速会导致长时间部署不成功,建议通过 Docker 将镜像下载到所有的 Node 工作节点本地仓库后再部署。
如果部署在隔离网络中,需要首先在能够连接互联网且装有 docker 的代理主机上拉取镜像到本地,然后从代理主机上将镜像导入到所有的 Node 工作节点上。
Docker 获取镜像的指令:
docker pull quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.30.0如何安装 Docker 及拉取、导出、导入镜像,请阅读文章《RedHat/CentOS8【Docker】镜像制作编排和容器部署》【https://www.jianshu.com/p/a4198b127729】。
3、部署(更新) YAML 文件。
[centos@k8s-master ~]$ kubectl apply -f /usr/local/kubernetes/server/etc/kube-ingress-nginx.yaml
namespace/ingress-nginx created
configmap/nginx-configuration created
configmap/tcp-services created
configmap/udp-services created
serviceaccount/nginx-ingress-serviceaccount created
clusterrole.rbac.authorization.k8s.io/nginx-ingress-clusterrole created
role.rbac.authorization.k8s.io/nginx-ingress-role created
rolebinding.rbac.authorization.k8s.io/nginx-ingress-role-nisa-binding created
clusterrolebinding.rbac.authorization.k8s.io/nginx-ingress-clusterrole-nisa-binding created
daemonset.apps/nginx-ingress-controller created
limitrange/ingress-nginx created
4、查看 Ingress-Nginx Pod 的运行状态。
[centos@k8s-master ~]$ kubectl get pod -n ingress-nginx -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-ingress-controller-hrjbl 1/1 Running 0 58s 192.168.0.31 k8s-node1
nginx-ingress-controller-sjh8z 1/1 Running 0 58s 192.168.0.32 k8s-node2
注意:【STATUS】为“Running”时,表示正常运行。
5、查看 Ingress-Nginx Pod 的详细信息和事件。
[centos@k8s-master ~]$ kubectl describe pod nginx-ingress-controller-hrjbl -n ingress-nginx
6、查看 Ingress-Nginx 容器的日志。
[centos@k8s-master ~]$ kubectl logs nginx-ingress-controller-hrjbl -n ingress-nginx
4.Http 服务发布
以 "web" 服务为例,通过虚拟主机域名【ingress.web】访问。在 Master 主控节点上执行以下操作步骤:
1、创建 Ingress 资源的 YAML 文件。
使用文本编辑器创建 "/usr/local/kubernetes/server/etc/ingress-web.yaml":
[centos@k8s-master ~]$ sudo gedit /usr/local/kubernetes/server/etc/ingress-web.yaml
编辑内容如下:
---
# API 版本
apiVersion: networking.k8s.io/v1beta1
# 资源类型
kind: Ingress
# 元数据
metadata:
# 注解,更多注解的使用请阅读官方文档【https://kubernetes.github.io/ingress-nginx/examples/】
annotations:
# 允许跨域访问
nginx.ingress.kubernetes.io/cors-allow-headers: "DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization"
nginx.ingress.kubernetes.io/cors-allow-methods: "PUT, GET, POST, OPTIONS"
nginx.ingress.kubernetes.io/cors-allow-origin: "*"
nginx.ingress.kubernetes.io/enable-cors: "true"
# 资源名称
name: ingress-web
# 资源命名空间
namespace: default
spec:
# 规则
rules:
# 虚拟主机域名
- host: ingress.web
http:
paths:
# 路由
- path: /
# 后端服务声明
backend:
# 服务名称
serviceName: web
# 服务内部端口号
servicePort: 80
2、部署(更新) YAML 文件。
[centos@k8s-master ~]$ kubectl apply -f /usr/local/kubernetes/server/etc/ingress-web.yaml
ingress.networking.k8s.io/ingress-web created
3、在 DNS 服务中建立虚拟主机和 IP 地址的映射关系。
以使用本地 DNS 文件建立映射关系为例,使用文本编辑器创建 "/etc/hosts":
[centos@k8s-master ~]$ sudo gedit /etc/hosts
在文件中追加以下内容:
# IP 地址选择 192.168.0.31(32、33)任意一个 Node 工作节点均可。
192.168.0.31 ingress.web
4、在 Node 工作节点所在网络的任意的主机(已正确该域名的配置 DNS 服务)上通过浏览器,输入域名【http://ingress.web】测试。
5.Https 服务发布
5.1.制作虚拟主机证书
以 "web" 服务为例,通过虚拟主机域名【ingress.web.ssl】访问。在 "SSL 证书服务器" 上执行以下操作步骤:
1、安装 OpenSSL 。
[centos@host ~ ]$ sudo dnf install openssl
2、创建虚拟主机证书工作目录。
证书包括 CA 认证机构、服务器和客户端三类证书的制作,在虚拟主机证书工作根目录下分别建立"ca"、"server"、"client"子目录存放对应的输出文件,并设置所有者为证书管理账户。
[centos@host ~ ]$ sudo mkdir -p /data/ssl/vhost/ca
[centos@host ~ ]$ sudo mkdir -p /data/ssl/vhost/server
[centos@host ~ ]$ sudo mkdir -p /data/ssl/vhost/client
[centos@host ~ ]$ sudo chown -R centos:centos /data/ssl/vhost
3、术语说明
文件类型 | 说明 |
---|---|
KEY | 非对称私钥文件,文件扩展名通常为 ".key" |
CSR | 只包含公钥的证书签名申请,文件扩展名通常为 ".csr" |
PEM | 只包含公钥的证书,文件扩展名通常为 ".pem" |
PKCS12 | 包含公钥和私钥证书,文件扩展名通常为 ".p12" |
5.1.1.第一阶段:制作 CA 根证书
1、制作 CA【秘钥】。
操作过程:设置 CA 秘钥口令。
[centos@host ~ ]$ openssl genrsa -des3 -out /data/ssl/vhost/ca/ca.key 2048
Generating RSA private key, 2048 bit long modulus (2 primes)
................................+++++
............+++++
e is 65537 (0x010001)
Enter pass phrase for /data/ssl/vhost/ca/ca.key:
Verifying - Enter pass phrase for /data/ssl/vhost/ca/ca.key:
说明:
- 【openssl genrsa】表示制作秘钥。
- 【-des3】表示加密秘钥使用的算法;
- 【-out】表示秘钥的输出文件;
- 【2048】表示秘钥的密码强度。
查看 CA 秘钥文件(需要输入秘钥口令):
[centos@host ~ ] openssl rsa -in /data/ssl/vhost/ca/ca.key
Enter pass phrase for /data/ssl/vhost/ca/ca.key:
......
2、制作 CA 【根证书签名申请】。
输入 CA 秘钥文件,输出 CA 根证书签名申请文件。
操作过程:验证 CA 秘钥口令 => 设置国家名称 => 设置省份名称 => 设置城市名称 => 设置组织机构名称 => 设置组织单元名称 => 设置证书名称 => 设置电子邮件地址和扩展属性(密码提示信息和可选的公司名称)。
[centos@host ~ ]$ openssl req -new -key /data/ssl/vhost/ca/ca.key -out /data/ssl/vhost/ca/ca.csr
Enter pass phrase for /data/ssl/vhost/ca/ca.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:ch
State or Province Name (full name) []:sd
Locality Name (eg, city) [Default City]:qd
Organization Name (eg, company) [Default Company Ltd]:private
Organizational Unit Name (eg, section) []:zhangyi
Common Name (eg, your name or your server's hostname) []:ca
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
说明:
- 【openssl req】表示制作证书签名申请。
- 【-new】表示生成证书请求文件;
- 【-key】表示秘钥的输入文件;
- 【-out】表示证书签名申请的输出文件。
注意:【Common Name】应为 CA 机构的名称。
查看 CA 证书申请文件:
[centos@host ~ ]$ openssl req -in /data/ssl/vhost/ca/ca.csr -noout -text
3、生成 CA 自签名【根证书】,即对签名申请进行自签名生成证书。
输入 CA 秘钥文件、CA 根证书签名申请,输出 CA 自签名根证书文件。
操作过程:验证 CA 秘钥口令。
[centos@host ~ ]$ openssl x509 -req -days 3650 -signkey /data/ssl/vhost/ca/ca.key -in /data/ssl/vhost/ca/ca.csr -out /data/ssl/vhost/ca/ca.pem
Signature ok
subject=C = ch, ST = sd, L = qd, O = private, OU = zhangyi, CN = ca
Getting Private key
Enter pass phrase for /data/ssl/vhost/ca/ca.key:
说明:
- 【openssl x509】表示制作自签名证书。
- 【-req】表示输入文件的类型是证书签名申请;
- 【-days】表示证书的有效期,单位是天;
- 【-signkey】表示签名秘钥的输入文件;
- 【-in】表示证书签名申请的输入文件;
- 【-out】表示证书的输出文件。
查看 CA 证书文件:
[centos@host ~ ]$ openssl x509 -in /data/ssl/vhost/ca/ca.pem -noout -text
4、导出 CA【 PKCS12 证书】。
输入 CA 自签的 CA 证书文件、CA 秘钥,输出 CA PKCS12 证书。
操作过程:设置 PKCS12 证书口令。
[centos@host ~ ]$ gmssl pkcs12 -export -in /data/ssl/vhost/ca/ca.pem -inkey /data/ssl/vhost/ca/ca.key -out /data/ssl/vhost/ca/ca.p12 -name ca
Enter Export Password:
Verifying - Enter Export Password:
说明:
- 【openssl pkcs12】表示制作 PKCS12 证书。
- 【-export 】表示导出 PKCS12 证书;
- 【-in】表示签名证书的输入文件;
- 【-inkey】表示秘钥的输入文件;
- 【-name】表示 PKCS12 证书的别名;
- 【-out】表示 PKCS12 证书的输出文件。
查看 CA PKCS12 证书文件(需要输入 CA PKCS12 证书口令):
[centos@host ~ ]$ gmssl pkcs12 -in /data/ssl/vhost/ca/ca.p12 -info
Enter Import Password:
......
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
......
5、查看 CA 产生的全部文件。
[centos@host ~ ]$ ls /data/ssl/vhost/ca/
ca.csr ca.key ca.p12 ca.pem
5.1.2.第二阶段:制作服务器证书
1、制作服务器【秘钥】。
操作过程:设置服务器秘钥口令。
[centos@host ~ ]$ openssl genrsa -des3 -out /data/ssl/vhost/server/ingress-web-ssl.key 2048
Generating RSA private key, 2048 bit long modulus (2 primes)
.......................................................+++++
...........+++++
e is 65537 (0x010001)
Enter pass phrase for /data/ssl/vhost/server/ingress-web-ssl.key:
Verifying - Enter pass phrase for /data/ssl/vhost/server/ingress-web-ssl.key:
说明:
- 【openssl genrsa】表示制作秘钥。
- 【-des3】表示加密秘钥使用的算法;
- 【-out】表示秘钥的输出文件;
- 【2048】表示秘钥的密码强度。
查看服务器秘钥文件(需要输入秘钥口令):
[centos@host ~ ] openssl rsa -in /data/ssl/vhost/server/ingress-web-ssl.key
Enter pass phrase for /data/ssl/vhost/server/ingress-web-ssl.key:
......
2、制作服务器【证书签名申请】。
输入服务器秘钥文件,输出服务器证书签名申请文件。
操作过程:验证服务器秘钥口令 => 设置国家名称 => 设置省份名称 => 设置城市名称 => 设置组织机构名称 => 设置组织单元名称 => 设置证书名称 => 设置电子邮件地址和扩展属性(密码提示信息和可选的公司名称)。
[centos@host ~ ]$ openssl req -new -key /data/ssl/vhost/server/ingress-web-ssl.key -out /data/ssl/vhost/server/ingress-web-ssl.csr
Enter pass phrase for /data/ssl/vhost/server/ingress-web-ssl.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:ch
State or Province Name (full name) []:sd
Locality Name (eg, city) [Default City]:qd
Organization Name (eg, company) [Default Company Ltd]:private
Organizational Unit Name (eg, section) []:zhangyi
Common Name (eg, your name or your server's hostname) []:ingress-web-ssl
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
说明:
- 【openssl req】表示制作证书签名申请。
- 【-new】表示生成证书请求文件;
- 【-key】表示秘钥的输入文件;
- 【-out】表示证书签名申请的输出文件。
注意:【Common Name】应为服务器的 IP 地址或者 DNS(如:192.168.216.128 或者 localhost)。在 在 Web 容器配置后,当客户端使用 HTTPS 协议访问时,如果域名与【Common Name】不一致,则会进行风险提示。
查看服务器证书申请文件:
[centos@host ~ ]$ openssl req -in /data/ssl/vhost/server/ingress-web-ssl.csr -noout -text
3、生成 CA 签名的服务器【证书】,即 CA 对服务器签名申请进行签名生成服务器证书。
输入 CA 根证书文件、 CA 秘钥文件、服务器证书签名申请,输出 CA 签名的服务器证书文件。
操作过程:验证 CA 秘钥口令。
[centos@host ~ ]$ openssl x509 -req -days 3650 -CA /data/ssl/vhost/ca/ca.pem -CAkey /data/ssl/vhost/ca/ca.key -CAcreateserial -in /data/ssl/vhost/server/ingress-web-ssl.csr -out /data/ssl/vhost/server/ingress-web-ssl.pem
Signature ok
subject=C = ch, ST = sd, L = qd, O = private, OU = zhangyi, CN = 192.168.216.128
Getting CA Private Key
Enter pass phrase for /data/ssl/vhost/ca/ca.key:
说明:
- 【openssl x509】表示制作 CA 签名的证书。
- 【-req】表示输入文件的类型是证书签名申请;
- 【-days】表示证书的有效期,单位是天;
- 【-CA】表示 CA 根证书的输入文件;
- 【-CAkey】表示 CA 秘钥的输入文件;
- 【-CAcreateserial】表示如果 CA 序列号文件不存在自动创建;
- 【-in】表示证书签名申请的输入文件;
- 【-out】表示证书的输出文件。
查看服务器证书文件:
[centos@host ~ ]$ openssl x509 -in /data/ssl/vhost/server/ingress-web-ssl.pem -noout -text
4、导出服务器【 PKCS12 证书】。
输入 CA 签名的服务器证书文件,输出服务器 PKCS12 证书。
操作过程:验证服务器秘钥口令 => 设置 PKCS12 证书口令。
[centos@host ~ ]$ openssl pkcs12 -export -in /data/ssl/vhost/server/ingress-web-ssl.pem -inkey /data/ssl/vhost/server/ingress-web-ssl.key -out /data/ssl/vhost/server/ingress-web-ssl.p12 -name ingress-web-ssl
Enter pass phrase for /data/ssl/vhost/server/ingress-web-ssl.key:
Enter Export Password:
Verifying - Enter Export Password:
说明:
- 【openssl pkcs12】表示制作 PKCS12 证书。
- 【-export 】表示导出 PKCS12 证书;
- 【-in】表示签名证书的输入文件;
- 【-inkey】表示秘钥的输入文件;
- 【-name】表示 PKCS12 证书的别名;
- 【-out】表示 PKCS12 证书的输出文件。
查看服务器 PKCS12 证书文件(需要输入服务器 PKCS12 证书口令):
[centos@host ~ ]$ openssl pkcs12 -in /data/ssl/vhost/server/ingress-web-ssl.p12 -info
Enter Import Password:
......
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
......
5、查看服务器产生的全部文件。
[centos@host ~ ]$ ls /data/ssl/vhost/ingress-web-ssl
ingress-web-ssl.pem ingress-web-ssl.csr ingress-web-ssl.key ingress-web-ssl.p12
5.1.3.第三阶段:制作客户端证书(双向认证时使用)
1、制作客户端【秘钥】。
操作过程:设置客户端秘钥口令。
[centos@host ~ ]$ openssl genrsa -des3 -out /data/ssl/vhost/client/client.key 2048
Generating RSA private key, 2048 bit long modulus (2 primes)
.........+++++
..........+++++
e is 65537 (0x010001)
Enter pass phrase for /data/ssl/vhost/client/client.key:
Verifying - Enter pass phrase for /data/ssl/vhost/client/client.key:
说明:
- 【openssl genrsa】表示制作秘钥。
- 【-des3】表示加密秘钥使用的算法;
- 【-out】表示秘钥的输出文件;
- 【2048】表示秘钥的密码强度。
查看客户端秘钥文件(需要输入秘钥口令):
[centos@host ~ ] openssl rsa -in /data/ssl/vhost/client/client.key
Enter pass phrase for /data/ssl/vhost/client/client.key:
......
2、制作客户端【证书签名申请】。
输入客户端秘钥文件,输出客户端证书签名申请文件。
操作过程:验证客户端秘钥口令 => 设置国家名称 => 设置省份名称 => 设置城市名称 => 设置组织机构名称 => 设置组织单元名称 => 设置证书名称 => 设置电子邮件地址和扩展属性(密码提示信息和可选的公司名称)。
[centos@host ~ ]$ openssl req -new -key /data/ssl/vhost/client/client.key -out /data/ssl/vhost/client/client.csr
nter pass phrase for /data/ssl/vhost/client/client.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:ch
State or Province Name (full name) []:sd
Locality Name (eg, city) [Default City]:qd
Organization Name (eg, company) [Default Company Ltd]:private
Organizational Unit Name (eg, section) []:zhangyi
Common Name (eg, your name or your server's hostname) []:https_client
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
说明:
- 【openssl req】表示制作证书签名申请。
- 【-new】表示生成证书请求文件;
- 【-key】表示秘钥的输入文件;
- 【-out】表示证书签名申请的输出文件。
注意:【Common Name】应为客户端的统一标识。
查看客户端证书申请文件:
[centos@host ~ ]$ openssl req -in /data/ssl/vhost/client/client.csr -noout -text
3、生成 CA 签名的客户端【证书】,即 CA 对客户端签名申请进行签名生成客户端证书。
输入 CA 根证书文件、 CA 秘钥文件、客户端证书签名申请,输出 CA 签名的客户端证书文件。
操作过程:验证 CA 秘钥口令。
[centos@host ~ ]$ openssl x509 -req -days 3650 -CA /data/ssl/vhost/ca/ca.pem -CAkey /data/ssl/vhost/ca/ca.key -CAcreateserial -in /data/ssl/vhost/client/client.csr -out /data/ssl/vhost/client/client.pem
Signature ok
subject=C = ch, ST = sd, L = qd, O = private, OU = zhangyi, CN = https_client
Getting CA Private Key
Enter pass phrase for /data/ssl/vhost/ca/ca.key:
说明:
- 【openssl x509】表示制作 CA 签名的证书。
- 【-req】表示输入文件的类型是证书签名申请;
- 【-days】表示证书的有效期,单位是天;
- 【-CA】表示 CA 根证书的输入文件;
- 【-CAkey】表示 CA 秘钥的输入文件;
- 【-CAcreateserial】表示如果 CA 序列号文件不存在自动创建;
- 【-in】表示证书签名申请的输入文件;
- 【-out】表示证书的输出文件。
查看客户端证书文件:
[centos@host ~ ]$ openssl x509 -in /data/ssl/vhost/client/client.pem -noout -text
4、导出客户端【 PKCS12 证书】。
输入 CA 签名的客户端证书文件,输出客户端 PKCS12 证书。
操作过程:验证客户端秘钥口令 => 设置 PKCS12 证书口令。
[centos@host ~ ]$ openssl pkcs12 -export -in /data/ssl/vhost/client/client.pem -inkey /data/ssl/vhost/client/client.key -out /data/ssl/vhost/client/client.p12 -name https_client
Enter pass phrase for /data/ssl/vhost/client/client.key:
Enter Export Password:
Verifying - Enter Export Password:
说明:
- 【openssl pkcs12】表示制作 PKCS12 证书。
- 【-export 】表示导出 PKCS12 证书;
- 【-in】表示签名证书的输入文件;
- 【-inkey】表示秘钥的输入文件;
- 【-name】表示 PKCS12 证书的别名;
- 【-out】表示 PKCS12 证书的输出文件。
查看客户端 PKCS12 证书文件(需要输入客户端 PKCS12 证书口令):
[centos@host ~ ]$ openssl pkcs12 -in /data/ssl/vhost/client/client.p12 -info
Enter Import Password:
......
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
......
5、查看客户端产生的全部文件。
[centos@host ~ ]$ ls /data/ssl/vhost/client
client.pem client.csr client.key client.p12
5.2.Https 服务发布
以 "web" 服务为例,通过虚拟主机域名【ingress.web.ssl】访问。在 Master 主控节点上执行以下操作步骤:
1、创建虚拟主机秘钥目录,并从 SSL 证书服务器上获取已创建的虚拟主机证书和虚拟主机证书秘钥 。
1)创建虚拟主机秘钥目录:
[centos@k8s-master ~]$ sudo mkdir -p /usr/local/kubernetes/server/ssl/ingress.web.ssl
2)使用 ssh 远程登录到 SSL 证书服务器,并将 SSL 证书服务器上已制作好的虚拟主机证书和虚拟主机证书秘钥通过 scp 拷贝到 "Master 主控节点"(当前主机) 的 K8s Server 秘钥目录中:
[centos@k8s-master ~]$ ssh [email protected]
[email protected]'s password:
[centos@k8s-ssl ~]$ scp -r /data/ssl/vhost/server/ingress-web-ssl.key [email protected]:/usr/local/kubernetes/server/ssl/ingress.web.ssl
[email protected]'s password:
ingress-web-ssl.key 100% 1375 522.3KB/s 00:00
[centos@k8s-ssl ~]$ scp -r /data/ssl/vhost/server/ingress-web-ssl.pem [email protected]:/usr/local/kubernetes/server/ssl/ingress.web.ssl
[email protected]'s password:
ingress-web-ssl.pem 100% 1675 529.6KB/s 00:00
[centos@k8s-ssl ~]$ exit
[centos@k8s-etcd1 ~]$ sudo chmod 644 /usr/local/kubernetes/server/ssl/ingress.web.ssl/*
[centos@k8s-etcd1 ~]$ ll /usr/local/kubernetes/server/ssl/ingress.web.ssl
-rw-r--r-- 1 root root 1675 9月 7 16:52 ingress-web-ssl.key
-rw-r--r-- 1 root root 1375 9月 7 16:50 ingress-web-ssl.pem
2、在 K8s 中创建虚拟主机的 TLS 证书资源。
[centos@k8s-ssl ~]$ kubectl create secret tls ingress-web-ssl --key=/usr/local/kubernetes/server/ssl/ingress.web.ssl/ingress-web-ssl.key --cert=/usr/local/kubernetes/server/ssl/ingress.web.ssl/ingress-web-ssl.pem
secret/ingress-web-ssl created
格式:kubectl create secret tls [名称] [--cert] [--key]
参数:
[名称]:证书资源的名字,在创建 Ingress 时用于绑定证书资源
[--key]:虚拟主机证书秘钥文件
[--cert]:虚拟主机证书文件
3、创建 Ingress 资源的 YAML 文件。
使用文本编辑器创建 "/usr/local/kubernetes/server/etc/ingress-web-ssl.yaml":
[centos@k8s-master ~]$ sudo gedit /usr/local/kubernetes/server/etc/ingress-web-ssl.yaml
编辑内容如下:
---
# API 版本
apiVersion: networking.k8s.io/v1beta1
# 资源类型
kind: Ingress
# 元数据
metadata:
# 注解,更多注解的使用请阅读官方文档【https://kubernetes.github.io/ingress-nginx/examples/】
annotations:
# 允许跨域访问
nginx.ingress.kubernetes.io/cors-allow-headers: "DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization"
nginx.ingress.kubernetes.io/cors-allow-methods: "PUT, GET, POST, OPTIONS"
nginx.ingress.kubernetes.io/cors-allow-origin: "*"
nginx.ingress.kubernetes.io/enable-cors: "true"
# 资源名称
name: ingress-web-ssl
# 资源命名空间
namespace: default
spec:
# 证书
tls:
# 虚拟主机域名
- hosts:
- ingress.web.ssl
# 证书资源名称
secretName: ingress-web-ssl
# 规则
rules:
# 虚拟主机域名
- host: ingress.web.ssl
http:
paths:
# 路由
- path: /
# 后端服务声明
backend:
# 服务名称
serviceName: web
# 服务内部端口号
servicePort: 80
4、部署(更新) YAML 文件。
[centos@k8s-master ~]$ kubectl apply -f /usr/local/kubernetes/server/etc/ingress-web-ssl.yaml
ingress.networking.k8s.io/ingress-web-ssl created
5、在 DNS 服务中建立虚拟主机和 IP 地址的映射关系。
以使用本地 DNS 文件建立映射关系为例,使用文本编辑器创建 "/etc/hosts":
[centos@k8s-master ~]$ sudo gedit /etc/hosts
在文件中追加以下内容:
# IP 地址选择 192.168.0.31(32、33)任意一个 Node 工作节点均可。
192.168.0.31 ingress.web.ssl
6、在 Node 工作节点所在网络的任意的主机(已正确该域名的配置 DNS 服务)上通过浏览器,输入域名【https://ingress.web.ssl】测试。
5.3.Https 服务发布(双向认证)
以 "web" 服务为例,通过虚拟主机域名【ingress.web.ssl】访问。在 Master 主控节点上执行以下操作步骤:
1、创建虚拟主机秘钥目录,并从 SSL 证书服务器上获取已创建的虚拟主机证书和虚拟主机证书秘钥 。
1)创建虚拟主机秘钥目录:
[centos@k8s-master ~]$ sudo mkdir -p /usr/local/kubernetes/server/ssl/ingress.web.ssl
2)使用 ssh 远程登录到 SSL 证书服务器,并将 SSL 证书服务器上已制作好的虚拟主机证书和虚拟主机证书秘钥通过 scp 拷贝到 "Master 主控节点"(当前主机) 的 K8s Server 秘钥目录中:
[centos@k8s-master ~]$ ssh [email protected]
[email protected]'s password:
[centos@k8s-ssl ~]$ scp -r /data/ssl/vhost/server/ingress-web-ssl.key [email protected]:/usr/local/kubernetes/server/ssl/ingress.web.ssl
[email protected]'s password:
ingress-web-ssl.key 100% 1375 522.3KB/s 00:00
[centos@k8s-ssl ~]$ scp -r /data/ssl/vhost/server/ingress-web-ssl.pem [email protected]:/usr/local/kubernetes/server/ssl/ingress.web.ssl
[email protected]'s password:
ingress-web-ssl.pem 100% 1675 529.6KB/s 00:00
[centos@k8s-ssl ~]$ scp -r /data/ssl/vhost/ca/ca.pem [email protected]:/usr/local/kubernetes/server/ssl/ingress.web.ssl
[email protected]'s password:
ca.pem 100% 1675 529.6KB/s 00:00
[centos@k8s-ssl ~]$ exit
[centos@k8s-etcd1 ~]$ sudo chmod 644 /usr/local/kubernetes/server/ssl/ingress.web.ssl/*
[centos@k8s-etcd1 ~]$ ll /usr/local/kubernetes/server/ssl/ingress.web.ssl
-rw-r--r-- 1 root root 1675 9月 7 16:52 ingress-web-ssl.key
-rw-r--r-- 1 root root 1375 9月 7 16:50 ingress-web-ssl.pem
-rw-r--r-- 1 root root 1375 9月 7 16:50 ca.pem
2、在 K8s 中创建虚拟主机的 TLS 证书资源。
[centos@k8s-ssl ~]$ kubectl create secret tls ingress-web-ssl --key=/usr/local/kubernetes/server/ssl/ingress.web.ssl/ingress-web-ssl.key --cert=/usr/local/kubernetes/server/ssl/ingress.web.ssl/ingress-web-ssl.pem
secret/ingress-web-ssl created
[centos@k8s-ssl ~]$ kubectl create secret generic ca-secret --from-file=ca.crt=/usr/local/kubernetes/server/ssl/ingress.web.ssl/ca.pem
secret/ca-secretl created
格式:kubectl create secret tls [名称] [--cert] [--key]
参数:
[名称]:证书资源的名字,在创建 Ingress 时用于绑定证书资源
[--key]:虚拟主机证书秘钥文件
[--cert]:虚拟主机证书文件
3、创建 Ingress 资源的 YAML 文件。
使用文本编辑器创建 "/usr/local/kubernetes/server/etc/ingress-web-ssl.yaml":
[centos@k8s-master ~]$ sudo gedit /usr/local/kubernetes/server/etc/ingress-web-ssl.yaml
编辑内容如下:
---
# API 版本
apiVersion: networking.k8s.io/v1beta1
# 资源类型
kind: Ingress
# 元数据
metadata:
# 注解,更多注解的使用请阅读官方文档【https://kubernetes.github.io/ingress-nginx/examples/】
annotations:
# 允许跨域访问
nginx.ingress.kubernetes.io/cors-allow-headers: "DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization"
nginx.ingress.kubernetes.io/cors-allow-methods: "PUT, GET, POST, OPTIONS"
nginx.ingress.kubernetes.io/cors-allow-origin: "*"
nginx.ingress.kubernetes.io/enable-cors: "true"
# 双向认证(客户端认证)
# 启用客户端认证
nginx.ingress.kubernetes.io/auth-tls-verify-client: "on"
# 指定根证书的证书资源名称,格式:"/"
nginx.ingress.kubernetes.io/auth-tls-secret: "default/ca-secret"
# 指定验证证书链的深度
nginx.ingress.kubernetes.io/auth-tls-verify-depth: "1"
# 指定验证失败的请求重定向 URL
nginx.ingress.kubernetes.io/auth-tls-error-page: "http://ingress.web.ssl/error-cert.html"
# 是否将证书传递给后端的服务
nginx.ingress.kubernetes.io/auth-tls-pass-certificate-to-upstream: "true"
# 资源名称
name: ingress-web-ssl
# 资源命名空间
namespace: default
spec:
# 证书
tls:
# 虚拟主机域名
- hosts:
- ingress.web.ssl
# 证书资源名称
secretName: ingress-web-ssl
# 规则
rules:
# 虚拟主机域名
- host: ingress.web.ssl
http:
paths:
# 路由
- path: /
# 后端服务声明
backend:
# 服务名称
serviceName: web
# 服务内部端口号
servicePort: 80
4、部署(更新) YAML 文件。
[centos@k8s-master ~]$ kubectl apply -f /usr/local/kubernetes/server/etc/ingress-web-ssl.yaml
ingress.networking.k8s.io/ingress-web-ssl created
5、在 DNS 服务中建立虚拟主机和 IP 地址的映射关系。
以使用本地 DNS 文件建立映射关系为例,使用文本编辑器创建 "/etc/hosts":
[centos@k8s-master ~]$ sudo gedit /etc/hosts
在文件中追加以下内容:
# IP 地址选择 192.168.0.31(32、33)任意一个 Node 工作节点均可。
192.168.0.31 ingress.web.ssl
6、在 Node 工作节点所在网络的任意的主机(已正确该域名的配置 DNS 服务)上通过浏览器,输入域名【https://ingress.web.ssl】测试。
5.4.客户端配置
5.4.1.安装 CA 机构证书
5.4.2.安装客户端 PKCS12 证书(双向认证使用)
1、参照章节"5.4.1.安装 CA 机构证书",安装 CA 机构证书。
2、安装客户端 PKCS12 证书。