跳转至

虚拟机搭建集群

本文将使用 docker 和 kubeadm 在虚拟机上搭建一个简单的三节点集群

准备工作

  • 虚拟机软件:VMware Workstation 17 Player
  • 操作系统镜像:ubuntu-18.04.6-live-server-amd64.iso

创建虚拟机

  • master (2 CPUs 4G RAM 192.168.98.128)
  • node1 (2 CPUs 4G RAM 192.168.98.129)
  • node2 (2 CPUs 4G RAM 192.168.98.130)

注意:下面操作需在三台虚拟机上分别执行

获取 ip,配置 ssh

注意:以下操作均以 root 身份进行。为了方便操作,建议先配置好 ssh,使用 Windows Terminal、Termius 等工具操作虚拟机。

image-20230217213711201.png

关闭 swap 分区

swapoff -a

关闭防火墙

ufw disable # 关闭防火墙
ufw status  # 查看防火墙状态

安装 docker

apt update
apt install -y docker.io

安装 kubelet kubectl kubeadm

#!/bin/bash
apt update && apt install apt-transport-https
curl -fsSL https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main"
apt-get update
apt-cache madison kubelet kubectl kubeadm | grep "1.22.7-00"
apt install -y kubelet=1.22.7-00 kubectl=1.22.7-00 kubeadm=1.22.7-00

配置 cgroup 驱动程序

vim /etc/docker/daemon.json # 创建新文件 (1)
# 写入:
{
  "exec-opts": [
    "native.cgroupdriver=systemd"
  ]
}
# 保存退出
# 重启服务
systemctl daemon-reload
systemctl restart docker
systemctl restart kubelet
  1. 你好

注意:下面操作在 master 上执行

初始化 master 节点

kubeadm init \
  --kubernetes-version=v1.22.7 \
  --image-repository registry.aliyuncs.com/google_containers \
  --pod-network-cidr=10.24.0.0/16 \
  --ignore-preflight-errors=Swap

保存下面输出

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.98.128:6443 --token ************************ \
        --discovery-token-ca-cert-hash sha256:*****************************************************************

此时使用 kubectl get nodes 能看到一个节点

配置网络插件 flannel

# 获取yaml,可以cat查看一下
wget https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
# apply
kubectl apply -f kube-flannel.yml

安装dashboard(可选)

# 获取yaml,可以cat查看一下
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
# apply
kubectl apply -f recommended.yaml
# 创建用户
vim admin_user.yaml
#################################
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kubernetes-dashboard
################################
# apply
kubectl apply -f admin_user.yaml
# 创建token
kubectl -n kubernetes-dashboard create token admin-user # 复制输出的token
# 以端口转发方式开启(否则无法登录)
nohup kubectl port-forward -n kubernetes-dashboard \
  --address 0.0.0.0 service/kubernetes-dashboard 8080:443 &

访问dashboard(可选)

  • 浏览器访问 https://<master-ip>:8080,输入token,成功访问:

image-20230217214922307.png

注意:上面操作完成了基本的搭建过程

加入节点node1、node2

# 在node1上执行kubeadm初始化时输出的命令 
kubeadm join 192.168.98.128:6443 --token ************************ \
        --discovery-token-ca-cert-hash sha256:*****************************************************************
# 在node2上执行kubeadm初始化时输出的命令 
kubeadm join 192.168.98.128:6443 --token ************************ \
        --discovery-token-ca-cert-hash sha256:*****************************************************************

此时使用 kubectl get nodes 能看到三个节点

部署demo

  • 进入新工作目录 demo
  • 创建如下yaml文件

【nginx-deployment.yaml】

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80

【nginx-service.yaml】

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  type: NodePort
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
      nodePort: 30080

【nginx-ingress.yaml】

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx-example
  rules:
  - http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nginx-service
            port:
              number: 80
  • apply
kubectl apply -f nginx-deployment.yaml
kubectl apply -f nginx-service.yaml
kubectl apply -f nginx-ingress.yaml
  • 此时查看dashboard,如下:

image-20230217225013243.png

访问demo

浏览器访问http://<master-ip>:30080,看到如下页面: image-20230217224832424.png