快速部署 Kubernetes、Harbor 和 Web 服务的教程
本教程提供了一个深入的快速入门指南,涵盖了使用 Minikube 部署本地 Kubernetes 集群、通过 Ansible 生成和管理私有证书、利用 Helm 部署 Harbor 容器镜像仓库,以及部署一个安全的 demo Web 服务。本教程面向具有 Kubernetes、Helm 和 Ansible 基础知识的工程师,旨在展示这些工具如何协同工作以构建一个安全的开发环境。
前提条件
在开始之前,请确保您的系统满足以下要求:
- Minikube:用于运行本地 Kubernetes 集群 (Minikube 安装)。
- Docker:用于构建和推送容器镜像 (Docker 安装)。
- kubectl:Kubernetes 命令行工具 (kubectl 安装)。
- Helm:用于部署 Harbor (Helm 安装)。
- Ansible:用于自动化证书管理 (Ansible 安装)。
- 基本的 Kubernetes、Helm 和 Ansible 知识。
- 可选:Python 的 Kubernetes 客户端(
pip install kubernetes
),用于 Ansible 的k8s
模块。
第 1 部分:使用 Minikube 设置 Kubernetes
Minikube 是一个轻量级工具,可在本地运行单节点 Kubernetes 集群,非常适合开发和测试。
启动 Minikube:
minikube start
这将启动一个单节点 Kubernetes 集群。
启用 Ingress 插件: Minikube 的 Ingress 插件提供 NGINX Ingress 控制器,用于处理外部 HTTP/HTTPS 流量。
minikube addons enable ingress
验证 Ingress 控制器是否运行:
kubectl get pods -n ingress-nginx
配置 DNS: 获取 Minikube 的 IP 地址:
minikube ip
编辑
/etc/hosts
文件(需要管理员权限),添加以下条目,将<minikube ip>
替换为实际 IP:<minikube ip> harbor.example.com demo.example.com
这允许通过
harbor.example.com
和demo.example.com
访问服务。
第 2 部分:使用 Ansible 生成私有证书
我们将使用 Ansible 自动化生成自签名证书,并将它们存储为 Kubernetes Secret,供 Harbor 和 Web 服务使用。自签名证书适合开发环境,但在生产环境中应使用受信任的 CA 证书。
安装 Ansible 集合: 安装
community.crypto
和kubernetes.core
集合:ansible-galaxy collection install community.crypto ansible-galaxy collection install kubernetes.core
创建证书目录:
mkdir certs
创建 Ansible 剧本: 创建文件
generate_certs.yaml
,内容如下:
- name: Generate certificates and create Secrets
hosts: localhost
tasks:
- name: Create certs directory
file:
path: ./certs
state: directory
- name: Generate private key for Harbor
community.crypto.openssl_privatekey:
path: ./certs/harbor.key
- name: Generate self-signed certificate for Harbor
community.crypto.x509_certificate:
path: ./certs/harbor.crt
privatekey_path: ./certs/harbor.key
provider: selfsigned
subject:
commonName: harbor.example.com
- name: Create Kubernetes Secret for Harbor TLS
kubernetes.core.k8s:
state: present
definition:
apiVersion: v1
kind: Secret
metadata:
name: harbor-tls
namespace: default
type: kubernetes.io/tls
data:
tls.crt: "{{ lookup('file', './certs/harbor.crt') | b64encode }}"
tls.key: "{{ lookup('file', './certs/harbor.key') | b64encode }}"
- name: Generate private key for demo
community.crypto.openssl_privatekey:
path: ./certs/demo.key
- name: Generate self-signed certificate for demo
community.crypto.x509_certificate:
path: ./certs/demo.crt
privatekey_path: ./certs/demo.key
provider: selfsigned
subject:
commonName: demo.example.com
- name: Create Kubernetes Secret for demo TLS
kubernetes.core.k8s:
state: present
definition:
apiVersion: v1
kind: Secret
metadata:
name: demo-tls
namespace: default
type: kubernetes.io/tls
data:
tls.crt: "{{ lookup('file', './certs/demo.crt') | b64encode }}"
tls.key: "{{ lookup('file', './certs/demo.key') | b64encode }}"
运行脚本:
ansible-playbook generate_certs.yaml
这将为
harbor.example.com
和demo.example.com
生成自签名证书,并创建名为harbor-tls
和demo-tls
的 Kubernetes Secret。
第 3 部分:部署 Harbor
Harbor 是一个开源的容器镜像仓库,提供基于角色的访问控制、镜像漏洞扫描和镜像签名功能。我们将使用 Helm 部署 Harbor,并配置 TLS 以确保安全通信。
添加 Harbor Helm 仓库:
helm repo add harbor https://helm.goharbor.io helm repo update
创建 Helm 配置文件: 创建文件
values.yaml
,内容如下:
expose:
type: ingress
ingress:
hosts:
core: harbor.example.com
annotations:
core:
kubernetes.io/ingress.class: nginx
tls:
enabled: true
secretName: harbor-tls
externalURL: https://harbor.example.com
harborAdminPassword: "mysecretpassword"
安装 Harbor:
helm install harbor harbor/harbor -f values.yaml
验证部署: 检查 Harbor 组件是否运行:
kubectl get pods
访问
https://harbor.example.com
(可能需接受自签名证书警告)并使用用户名admin
和密码mysecretpassword
登录。
第 4 部分:部署 Demo Web 服务
我们将创建一个简单的 Node.js Web 应用,构建 Docker 镜像,推送到 Harbor,并通过 Kubernetes 部署,使用 Ingress 提供 HTTPS 访问。
创建 Web 应用: 创建目录
demo-app
并添加以下文件:app.js
:
const express = require('express');
const app = express();
app.get('/', (req, res) => res.send('Hello from demo app!'));
app.listen(3000, () => console.log('Demo app listening on port 3000'));
package.json
:
json { "name": "demo-app", "version": "1.0.0", "dependencies": { "express": "^4.17.1" } } ```
Dockerfile
:
FROM node:14
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "app.js"]
构建并推送 Docker 镜像:
登录 Harbor:
docker login harbor.example.com -u admin -p mysecretpassword
构建镜像:
docker build -t harbor.example.com/library/demo-app:latest .
推送镜像:
docker push harbor.example.com/library/demo-app:latest
创建 Kubernetes 资源:
- 创建
deployment.yaml
:
- 创建
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo-app
spec:
replicas: 1
selector:
matchLabels:
app: demo-app
template:
metadata:
labels:
app: demo-app
spec:
containers:
- name: demo-app
image: harbor.example.com/library/demo-app:latest
ports:
- containerPort: 3000
- 创建
service.yaml
:
apiVersion: v1
kind: Service
metadata:
name: demo-service
spec:
selector:
app: demo-app
ports:
- protocol: TCP
port: 80
targetPort: 3000
创建
ingress.yaml
:apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: demo-ingress annotations: kubernetes.io/ingress.class: nginx spec: tls: - hosts: - demo.example.com secretName: demo-tls rules: - host: demo.example.com http: paths: - path: / pathType: Prefix backend: service: name: demo-service port: number: 80
应用 Kubernetes 资源:
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
kubectl apply -f ingress.yaml
- 访问 Web 服务:
打开浏览器,访问
https://demo.example.com
。由于使用自签名证书,您可能需要接受安全警告。您应该看到消息:“Hello from demo app!”。