虚拟机搭建集群
本文将使用 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 等工具操作虚拟机。
关闭 swap 分区¶
关闭防火墙¶
安装 docker¶
安装 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
- 你好
注意:下面操作在 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
,成功访问:
注意:上面操作完成了基本的搭建过程
加入节点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,如下:
访问demo¶
浏览器访问http://<master-ip>:30080
,看到如下页面: