使用k8s部署Nginx并提供https证书访问

本文详细指导如何在kubernetes(K8s)环境中为Nginx配置HTTPS访问,涉及生成SSL证书、创建configMap、部署Deployment并进行测试,适合Kubernetes初学者和运维人员参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用k8s部署Nginx并提供https证书访问

1、在服务器内部创建证书

运行下列命令,将生成两个文件tls.key(秘钥)和tls.crt(证书内容)

openssl req -newkey rsa:2048 -nodes -keyout tls.key -x509 -days 365 -out tls.crt
Generating a 2048 bit RSA private key
...............+++
.............................+++
writing new private key to 'tls.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]:CN
State or Province Name (full name) []:Beijing
Locality Name (eg, city) [Default City]:Beijing
Organization Name (eg, company) [Default Company Ltd]:Kingsoft
Organizational Unit Name (eg, section) []:Ksyun
Common Name (eg, your name or your server's hostname) []:foo.bar.com
Email Address []:ksyun@kingsoft.com

2、将上述两个文件加入到configMap中

kubectl create configmap ssl-key --from-file=tls.key -n kce-test
kubectl create configmap ssl-crt --from-file=tls.crt -n kce-test

(configMap的名字需要和deployment.yaml的相对应)

3、编写default.conf文件

default.conf文件内容如下:

server {  
    listen 443;  

    ssl on;  
    ssl_certificate /etc/ssl/tls.crt;  
    ssl_certificate_key /etc/ssl/tls.key;  

    server_name foo.bar.com;  
    location / {  
    }  
}

将default.conf加入到configmap中:

kubectl create configmap nginx-volume --from-file=default.conf -n kce-test

4、启动部署deployment.yaml文件

deployment.yaml的内容如下:

# app/app.yaml
apiVersion: v1
kind: Service
metadata:
  name: llx-nginx-app
  namespace: kce-test
spec:
  selector:
    app: llx-nginx-app
  ports:
  - protocol: "TCP"
    port: 443
    targetPort: 443
  type: LoadBalancer

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: llx-nginx-app
  namespace: kce-test
spec:
  selector:
    matchLabels:
      app: llx-nginx-app
  replicas: 1
  template:
    metadata:
      labels:
        app: llx-nginx-app
    spec:
      containers:
      - name: llx-nginx
        image: hub-galaxy.yunyan.com/kce-test/nginx:alpine
        volumeMounts:
        - mountPath: /etc/nginx/conf.d/default.conf  # nginx 配置文件在 pod 中的路径
          name: nginx-volume
          subPath: default.conf
        - mountPath: /etc/ssl/tls.crt  # crt 文件在 pod 中的路径
          name: ssl-crt
          subPath: tls.crt
        - mountPath: /etc/ssl/tls.key  # 域名的 key 文件在 pod 中的路径
          name: ssl-key
          subPath: tls.key
        ports:
        - containerPort: 443
      volumes:
      - name: nginx-volume
        configMap:
          name: default.conf
      - name: ssl-crt
        configMap:
          name: tls.crt
      - name: ssl-key
        configMap:
          name: tls.key

启动命令:

kubectl apply -f deployment.yaml

5、测试

在这里插入图片描述

### KubernetesNginx Ingress 配置 SSL 教程 #### 1. 安装 Ingress-Nginx 控制器 为了在 Kubernetes使用 Nginx Ingress,首先需要安装 Ingress-Nginx 控制器。可以通过官方 GitHub 页面获取最新的部署文件[^3]。 执行以下命令来安装控制器: ```bash kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.7.0/deploy/static/provider/cloud/deploy.yaml ``` 确认 Ingress-Nginx 是否成功运行: ```bash kubectl get pods -n ingress-nginx ``` 这会显示 `ingress-nginx-controller` 的 Pod 运行状态[^4]。 #### 2. 创建服务和后端应用 假设已经有一个名为 `secure-service` 的服务正在监听 TCP 端口 443。如果没有,则可以创建一个简单的 Deployment 和 Service 来测试 HTTPS 流量转发功能: Deployment 示例: ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: secure-deployment spec: replicas: 1 selector: matchLabels: app: secure-app template: metadata: labels: app: secure-app spec: containers: - name: secure-container image: nginx ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: secure-service spec: type: ClusterIP selector: app: secure-app ports: - protocol: TCP port: 443 targetPort: 80 ``` 应用上述资源配置: ```bash kubectl apply -f deployment.yaml ``` 验证服务是否正常启动: ```bash kubectl get svc,deployments ``` #### 3. 启用 TLS 的 Ingress 配置 以下是带有 TLS 支持的 Ingress 资源定义模板[^2]: ```yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: tls-ingress namespace: default annotations: nginx.ingress.kubernetes.io/ssl-redirect: "true" spec: tls: - hosts: - secure.example.com secretName: tls-secret rules: - host: secure.example.com http: paths: - path: / pathType: ImplementationSpecific backend: service: name: secure-service port: number: 443 ``` 此配置中的关键字段解释如下: - **annotations**: 设置强制重定向到 HTTPS。 - **tls.secretName**: 使用预先创建的秘密对象存储证书和私钥。 #### 4. 创建 TLS 秘密 (Secret) 如果尚未准备好 SSL/TLS 证书,可以自签名生成或者从受信任的 CA 获取。下面是一个基于 OpenSSL 自签发证书的例子: 生成证书和私钥: ```bash openssl req -x509 -nodes -days 365 -newkey rsa:2048 \ -keyout tls.key -out tls.crt -subj "/CN=secure.example.com/O=Kubernetes Ingress Demo" ``` 将证书打包成 Kubernetes Secret 对象: ```bash kubectl create secret tls tls-secret --cert=tls.crt --key=tls.key ``` #### 5. 应用验证 Ingress 配置 保存上面提到的 Ingress YAML 文件为 `ingress-tls.yaml` 应用它: ```bash kubectl apply -f ingress-tls.yaml ``` 检查 Ingress 状态: ```bash kubectl describe ingress tls-ingress ``` 访问 URL (`https://secure.example.com`) 前需更新本地 `/etc/hosts` 或 DNS 解析指向 Ingress Controller 外部 IP 地址。 --- ###
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值