云原生架构之【Kubernetes(K8s)】第五部分:应用服务发布

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.部署拓扑图

K8s 集群拓扑图

网络资源规划:

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】测试。

通过主机头域名访问 Http 服务

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】测试。

通过主机头域名访问 Https 服务

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】测试。

通过主机头域名访问 Https 服务

5.4.客户端配置

5.4.1.安装 CA 机构证书

第1步
第2步
第3步
第4步
第5步
第6步

5.4.2.安装客户端 PKCS12 证书(双向认证使用)

1、参照章节"5.4.1.安装 CA 机构证书",安装 CA 机构证书。

2、安装客户端 PKCS12 证书。

第1步

第2步
第3步
第4步
第5步
第6步

你可能感兴趣的:(云原生架构之【Kubernetes(K8s)】第五部分:应用服务发布)