超详细教程:Ubuntu 22.04 搭建 Kubernetes 1.30.1 集群并部署 Dashboard 2.7.0 + Ingress-Nginx 1.10.1


在这里插入图片描述

引言

在当今数字化的浪潮中,容器编排技术变得愈发重要,而 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 地址角色
Mastermaster01192.168.1.10control-plane,etcd
Mastermaster02192.168.1.20control-plane,etcd
Mastermaster03192.168.1.30control-plane,etcd
Workerworker01192.168.1.41node
Workerworker02192.168.1.42node

这张表格就像是团队成员的信息表,清晰地记录了每个节点的类型、名称、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-iptablesnet.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 组件

我们需要安装 kubeletkubeadmkubectl 这三个重要的组件。

# 添加 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

更新软件包列表,安装指定版本的 kubeletkubeadmkubectl,并使用 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.crtssl.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 功能验证

  1. 打开浏览器,访问 https://k8s-dashboard.example.com
  2. 使用 dashboard-token.txt 中的令牌登录 Dashboard。
  3. 验证功能:
    • 查看集群节点状态,确保所有节点正常运行。
    • 检查工作负载资源使用情况,了解应用的运行状态。
    • 查看 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-bytesquota-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 的世界里取得成功!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

conkl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值