文章目录

引言
在当今数字化的浪潮中,容器编排技术变得愈发重要,而 Kubernetes 作为其中的佼佼者,正广泛应用于各类企业级应用的部署与管理。今天,我们就来一步步在 Ubuntu 22.04 系统上搭建 Kubernetes 1.30.1 集群,同时部署 Dashboard 2.7.0 和 Ingress-Nginx 1.10.1,为你的应用部署提供强大的支持。
第一章:环境规划与系统准备
1.1 集群架构设计
我们要搭建一个高可用的 Kubernetes 集群,采用 3 Master + 2 Worker 节点的设计。想象一下,这就像是一个精密的团队,Master 节点负责掌控全局,进行决策和调度,而 Worker 节点则是辛勤的劳动者,负责运行具体的应用。
网络规划
- Pod CIDR:设置为 10.244.0.0/16。这是分配给 Pod 的 IP 地址范围,就像是给每个 Pod 分配了一个专属的房间号码,方便它们在集群内部进行通信。
- Service CIDR:10.96.0.0/12 则是服务的 IP 地址范围。服务是 Kubernetes 中抽象的概念,用于对外暴露 Pod 的功能,这个范围就是服务的 “身份证号码”。
- 节点网络:使用 192.168.1.0/24,这是节点之间通信的网络范围,确保各个节点能够相互交流。
硬件要求
- Master 节点:需要 2 核 CPU、4GB 内存和 50GB 磁盘。Master 节点承担着重要的管理任务,就像团队的领导者,需要一定的资源来高效地工作。
- Worker 节点:4 核 CPU、8GB 内存和 100GB 磁盘。Worker 节点要运行大量的应用,所以需要更多的资源来保证应用的稳定运行。
1.2 节点信息表
节点类型 | 主机名 | IP 地址 | 角色 |
---|---|---|---|
Master | master01 | 192.168.1.10 | control-plane,etcd |
Master | master02 | 192.168.1.20 | control-plane,etcd |
Master | master03 | 192.168.1.30 | control-plane,etcd |
Worker | worker01 | 192.168.1.41 | node |
Worker | worker02 | 192.168.1.42 | node |
这张表格就像是团队成员的信息表,清晰地记录了每个节点的类型、名称、IP 地址和角色,方便我们进行管理和配置。
1.3 系统初始化(所有节点执行)
在开始搭建集群之前,我们需要对所有节点进行一些初始化操作,就像给团队成员进行入职培训一样,让它们做好准备。
# 禁用 Swap
sudo swapoff -a
sudo sed -i '/ swap / s/^/#/' /etc/fstab
禁用 Swap 是为了避免内存交换影响 Kubernetes 的性能。当系统内存不足时,Swap 会将部分内存数据交换到磁盘上,这会导致性能下降。通过这两条命令,我们永久禁用了 Swap。
# 设置时区同步
sudo timedatectl set-timezone Asia/Shanghai
sudo apt install chrony -y
sudo systemctl enable --now chrony
设置时区同步可以确保所有节点的时间一致,避免因时间不一致导致的各种问题。Chrony 是一个优秀的时间同步工具,我们安装并启用它来保证时间的准确性。
# 加载内核模块
sudo modprobe overlay
sudo modprobe br_netfilter
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
Overlay 和 br_netfilter 是 Kubernetes 运行所需的内核模块。Overlay 用于容器镜像的分层存储,br_netfilter 用于网络过滤。我们将这两个模块添加到配置文件中,确保系统在启动时自动加载。
# 优化内核参数
cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF
sudo sysctl --system
这些内核参数的优化是为了确保网络通信的正常进行。net.bridge.bridge-nf-call-iptables
和 net.bridge.bridge-nf-call-ip6tables
允许桥接网络的数据包通过 iptables 进行过滤,net.ipv4.ip_forward
允许 IP 转发。
# 安装基础工具
sudo apt update && sudo apt install -y \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release \
net-tools \
jq
这些基础工具是后续操作所必需的。apt-transport-https
用于通过 HTTPS 协议下载软件包,ca-certificates
用于验证 SSL 证书,curl
用于网络请求,gnupg
用于加密和签名,lsb-release
用于获取系统信息,net-tools
包含了一些常用的网络工具,jq
用于处理 JSON 数据。
第二章:容器运行时安装与配置
2.1 Containerd 高级配置
Containerd 是一个轻量级的容器运行时,就像一个高效的运输司机,负责将容器准确地送到目的地。
# 安装最新版 Containerd
sudo apt install -y containerd
使用 apt
命令安装最新版的 Containerd,确保我们使用的是最新的功能和安全补丁。
# 生成默认配置
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
创建 containerd
的配置目录,并生成默认的配置文件。这个配置文件包含了 containerd
的各种参数和设置。
# 优化配置参数
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
sudo sed -i 's/sandbox_image = ".*"/sandbox_image = "registry.k8s.io\/pause:3.9"/' /etc/containerd/config.toml
将 SystemdCgroup
设置为 true
,可以让 containerd
使用 systemd
作为 Cgroup 驱动,提高资源管理的效率。将 sandbox_image
设置为 registry.k8s.io/pause:3.9
,这是 Kubernetes 中用于隔离容器的沙箱镜像。
# 启用镜像加速
sudo mkdir -p /etc/containerd/certs.d
cat <<EOF | sudo tee /etc/containerd/certs.d/docker.io/hosts.toml
server = "https://docker.io"
[host."https://mirror.gcr.io"]
capabilities = ["pull", "resolve"]
EOF
由于从 Docker Hub 下载镜像可能会比较慢,我们启用镜像加速,使用 mirror.gcr.io
作为镜像源,提高镜像下载的速度。
# 重启服务
sudo systemctl restart containerd
sudo systemctl enable containerd
重启 containerd
服务,并将其设置为开机自启,确保 containerd
能够正常运行。
2.2 容器运行时验证
安装完成后,我们需要验证 containerd
是否能够正常工作。
# 测试容器运行
sudo ctr images pull docker.io/library/nginx:latest
sudo ctr run --rm -t docker.io/library/nginx:latest nginx-test nginx -v
使用 ctr
命令从 Docker Hub 下载 nginx
镜像,并运行一个临时的 nginx
容器,查看 nginx
的版本信息,验证容器是否能够正常运行。
# 检查 Cgroup 驱动
sudo containerd config dump | grep SystemdCgroup
通过查看 containerd
的配置信息,确认 SystemdCgroup
是否已经设置为 true
。
第三章:Kubernetes 集群部署
3.1 安装 Kubernetes 组件
我们需要安装 kubelet
、kubeadm
和 kubectl
这三个重要的组件。
# 添加 APT 源
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
添加 Kubernetes 的 APT 源,并导入 GPG 密钥,确保我们能够从官方源下载软件包。
# 安装指定版本
sudo apt update
sudo apt install -y \
kubelet=1.30.1-00 \
kubeadm=1.30.1-00 \
kubectl=1.30.1-00
sudo apt-mark hold kubelet kubeadm kubectl
更新软件包列表,安装指定版本的 kubelet
、kubeadm
和 kubectl
,并使用 apt-mark hold
命令锁定版本,防止系统自动更新这些组件。
3.2 高可用集群初始化
首节点初始化
sudo kubeadm init \
--control-plane-endpoint "k8s-api.example.com:6443" \
--upload-certs \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12 \
--kubernetes-version=v1.30.1 \
--image-repository=registry.aliyuncs.com/google_containers
使用 kubeadm init
命令初始化第一个 Master 节点。--control-plane-endpoint
指定了控制平面的端点,--upload-certs
用于上传证书,--pod-network-cidr
和 --service-cidr
分别指定了 Pod 和服务的 IP 地址范围,--kubernetes-version
指定了 Kubernetes 的版本,--image-repository
指定了镜像仓库,使用阿里云的镜像仓库可以提高镜像下载的速度。
配置 kubectl
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
将 admin.conf
复制到用户的 .kube
目录下,并修改文件权限,这样我们就可以使用 kubectl
命令来管理 Kubernetes 集群了。
添加其他 Master 节点
kubeadm join k8s-api.example.com:6443 \
--token <token> \
--discovery-token-ca-cert-hash <hash> \
--control-plane \
--certificate-key <cert-key>
使用 kubeadm join
命令将其他 Master 节点加入到集群中。需要注意的是,<token>
、<hash>
和 <cert-key>
需要从首节点初始化的输出中获取。
3.3 Calico 网络插件部署
Calico 是一个强大的网络插件,用于实现 Pod 之间的网络通信。
# 安装 Tigera Operator
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.27.0/manifests/tigera-operator.yaml
使用 kubectl
命令创建 Tigera Operator,这是 Calico 的管理组件。
# 自定义资源部署
cat <<EOF | kubectl apply -f -
apiVersion: operator.tigera.io/v1
kind: Installation
metadata:
name: default
spec:
calicoNetwork:
ipPools:
- blockSize: 26
cidr: 10.244.0.0/16
encapsulation: VXLANCrossSubnet
natOutgoing: Enabled
nodeSelector: all()
EOF
部署自定义资源,配置 Calico 的网络参数。blockSize
指定了 IP 池的块大小,cidr
指定了 IP 地址范围,encapsulation
指定了封装方式,natOutgoing
启用了 NAT 功能。
3.4 Worker 节点加入集群
# Worker 节点加入命令
sudo kubeadm join k8s-api.example.com:6443 \
--token <token> \
--discovery-token-ca-cert-hash <hash>
使用 kubeadm join
命令将 Worker 节点加入到集群中。同样,<token>
和 <hash>
需要从首节点初始化的输出中获取。
第四章:Kubernetes Dashboard 部署
4.1 部署 Dashboard 2.7.0
Kubernetes Dashboard 是一个可视化的管理界面,方便我们管理和监控 Kubernetes 集群。
# 部署核心组件
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
使用 kubectl
命令部署 Dashboard 的核心组件。
# 自定义 NodePort 服务
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Service
metadata:
name: kubernetes-dashboard-nodeport
namespace: kubernetes-dashboard
spec:
type: NodePort
ports:
- port: 443
targetPort: 8443
nodePort: 30443
selector:
k8s-app: kubernetes-dashboard
EOF
创建一个 NodePort 类型的服务,将 Dashboard 的端口映射到节点的 30443 端口,方便我们通过浏览器访问。
4.2 RBAC 权限配置
为了安全地访问 Dashboard,我们需要配置 RBAC 权限。
# 创建管理员账号
apiVersion: v1
kind: ServiceAccount
metadata:
name: cluster-admin
namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: cluster-admin-binding
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: cluster-admin
namespace: kubernetes-dashboard
创建一个名为 cluster-admin
的服务账号,并将其绑定到 cluster-admin
角色,赋予其管理员权限。
4.3 安全访问配置
生成长期有效的 Token
kubectl create token cluster-admin -n kubernetes-dashboard --duration=87600h > dashboard-token.txt
生成一个长期有效的 Token,并将其保存到 dashboard-token.txt
文件中,用于登录 Dashboard。
配置 HTTPS 证书
openssl req -x509 -nodes -days 3650 \
-newkey rsa:2048 \
-keyout dashboard.key \
-out dashboard.crt \
-subj "/CN=k8s-dashboard.example.com"
kubectl create secret tls dashboard-cert \
--key dashboard.key \
--cert dashboard.crt \
-n kubernetes-dashboard
使用 openssl
生成自签名的 HTTPS 证书,并将其创建为 Kubernetes 的 Secret,用于加密 Dashboard 的通信。
配置 Ingress 访问
cat <<EOF | kubectl apply -f -
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: dashboard-ingress
namespace: kubernetes-dashboard
annotations:
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:
tls:
- hosts:
- k8s-dashboard.example.com
secretName: dashboard-cert
rules:
- host: k8s-dashboard.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: kubernetes-dashboard
port:
number: 443
EOF
创建一个 Ingress 资源,将 k8s-dashboard.example.com
域名的请求转发到 Dashboard 服务,并使用之前创建的 HTTPS 证书进行加密。
第五章:Ingress-Nginx 高级部署
5.1 Helm 部署 Ingress-Nginx
Helm 是一个 Kubernetes 包管理工具,方便我们部署和管理复杂的应用。
# 安装 Helm
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
使用 curl
脚本安装 Helm。
# 添加仓库
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
添加 Ingress-Nginx 的 Helm 仓库,并更新仓库信息。
# 自定义 values.yaml
cat > ingress-values.yaml <<EOF
controller:
replicaCount: 3
minAvailable: 1
updateStrategy:
type: RollingUpdate
service:
type: LoadBalancer
annotations:
service.beta.kubernetes.io/aws-load-balancer-type: "nlb"
resources:
requests:
cpu: 100m
memory: 256Mi
metrics:
enabled: true
serviceMonitor:
enabled: true
config:
use-forwarded-headers: "true"
enable-underscores-in-headers: "true"
ssl-protocols: "TLSv1.2 TLSv1.3"
EOF
创建一个自定义的 values.yaml
文件,配置 Ingress-Nginx 的参数。replicaCount
指定了控制器的副本数量,minAvailable
指定了最小可用副本数,updateStrategy
指定了更新策略,service
指定了服务类型和注解,resources
指定了资源请求,metrics
启用了指标收集,config
配置了一些其他的参数。
# 部署 Ingress-Nginx
helm install ingress-nginx ingress-nginx/ingress-nginx \
--version 1.10.1 \
-n ingress-nginx \
--create-namespace \
-f ingress-values.yaml
使用 Helm 安装 Ingress-Nginx,指定版本、命名空间,并使用自定义的 values.yaml
文件进行配置。
5.2 高级功能配置
配置默认证书
# 配置默认证书
apiVersion: v1
kind: Secret
metadata:
name: default-ssl-certificate
namespace: ingress-nginx
type: kubernetes.io/tls
data:
tls.crt: $(base64 -w0 ssl.crt)
tls.key: $(base64 -w0 ssl.key)
创建一个 Secret,用于存储默认的 SSL 证书。需要将 ssl.crt
和 ssl.key
替换为实际的证书文件。
配置全局限流
# 配置全局限流
apiVersion: v1
kind: ConfigMap
metadata:
name: ingress-nginx-controller
namespace: ingress-nginx
data:
http-snippet: |
limit_req_zone $binary_remote_addr zone=global:10m rate=100r/s;
server {
listen 80;
location / {
limit_req zone=global burst=200 nodelay;
proxy_pass http://backend;
}
}
创建一个 ConfigMap,配置全局限流规则。limit_req_zone
定义了限流区域,limit_req
定义了限流规则。
第六章:集群验证与测试
6.1 集群健康检查
节点状态检查
# 节点状态检查
kubectl get nodes -o wide
kubectl describe node master01
使用 kubectl get nodes
命令查看节点的状态,使用 kubectl describe node
命令查看节点的详细信息,确保节点正常运行。
核心组件检查
# 核心组件检查
kubectl get pods -n kube-system
使用 kubectl get pods
命令查看 kube-system
命名空间下的 Pod 状态,确保核心组件正常运行。
网络连通性测试
# 网络连通性测试
kubectl run netcheck --image=alpine --rm -it -- sh
ping 10.96.0.10 # CoreDNS
nslookup kubernetes.default.svc.cluster.local
创建一个临时的 alpine
容器,在容器内部进行网络连通性测试,包括 Ping CoreDNS 和使用 nslookup
解析域名。
6.2 Dashboard 功能验证
- 打开浏览器,访问
https://k8s-dashboard.example.com
。 - 使用
dashboard-token.txt
中的令牌登录 Dashboard。 - 验证功能:
- 查看集群节点状态,确保所有节点正常运行。
- 检查工作负载资源使用情况,了解应用的运行状态。
- 查看 Pod 日志和终端,方便进行故障排查。
6.3 Ingress 流量测试
部署测试应用
# 部署测试应用
kubectl create deployment demo --image=nginx:1.25
kubectl expose deployment demo --port=80
创建一个名为 demo
的 Deployment,使用 nginx:1.25
镜像,并创建一个 Service 暴露该 Deployment 的端口。
创建 Ingress 规则
# 创建 Ingress 规则
cat <<EOF | kubectl apply -f -
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: demo-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx
rules:
- host: demo.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: demo
port:
number: 80
EOF
创建一个 Ingress 规则,将 demo.example.com
域名的请求转发到 demo
服务。
流量测试
# 流量测试
curl -H "Host: demo.example.com" http://<INGRESS_IP>
使用 curl
命令发送请求,测试 Ingress 的流量转发功能。需要将 <INGRESS_IP>
替换为 Ingress-Nginx 的实际 IP 地址。
第七章:安全加固与优化
7.1 集群安全加固
禁用匿名访问
# 禁用匿名访问
sudo vi /etc/kubernetes/manifests/kube-apiserver.yaml
# 添加:--anonymous-auth=false
编辑 kube-apiserver
的配置文件,添加 --anonymous-auth=false
参数,禁用匿名访问,提高集群的安全性。
启用 RBAC 审计
# 启用 RBAC 审计
cat <<EOF >> /etc/kubernetes/audit-policy.yaml
apiVersion: audit.k8s.io/v1
kind: Policy
rules:
- level: Metadata
resources:
- group: "rbac.authorization.k8s.io"
EOF
# 更新 kube-apiserver 配置
- --audit-policy-file=/etc/kubernetes/audit-policy.yaml
- --audit-log-path=/var/log/kubernetes/audit.log
创建一个审计策略文件,配置 RBAC 审计规则,并更新 kube-apiserver
的配置,启用审计功能,记录所有与 RBAC 相关的操作。
7.2 性能优化建议
kubelet 优化
# /etc/kubernetes/kubelet.conf
maxPods: 150
serializeImagePulls: false
编辑 kubelet
的配置文件,将 maxPods
设置为 150,允许每个节点运行更多的 Pod,将 serializeImagePulls
设置为 false
,允许并行拉取镜像,提高镜像拉取的速度。
etcd 优化
# /etc/kubernetes/manifests/etcd.yaml
- --max-request-bytes=33554432
- --quota-backend-bytes=8589934592
编辑 etcd
的配置文件,增加 max-request-bytes
和 quota-backend-bytes
的值,提高 etcd
的性能和存储容量。
网络优化
# Calico 配置
apiVersion: projectcalico.org/v3
kind: FelixConfiguration
metadata:
name: default
spec:
bpfEnabled: true
bpfExternalServiceMode: "DSR"
配置 Calico,启用 BPF 功能,并将 bpfExternalServiceMode
设置为 DSR
,提高网络性能。
结语
通过以上步骤,我们成功地在 Ubuntu 22.04 上搭建了 Kubernetes 1.30.1 高可用集群,并部署了 Dashboard 2.7.0 和 Ingress-Nginx 1.10.1。同时,我们还进行了集群验证、测试、安全加固和性能优化,确保集群的稳定运行和安全性。希望这篇教程对你有所帮助,祝你在 Kubernetes 的世界里取得成功!