Appearance
系列文章
环境准备
安装虚拟机软件
安装 Virtualbox 和 Extension Pack 。
我们将会使用 Virtualbox 部署 K8S 集群的master和一个node。
安装 Extension Pack 的目的是使用 Headless 模式启动虚拟机,方便后续在宿主机使用终端 ssh 通信操作。
安装OS
本文选择了 CentOS7 。
虚拟机属性上,分配 4核 CPU 和 4g 内存,网络使用桥接模式。
设置转发端口的目的是为了后续 ssh 连接到虚拟机。
启动虚拟机,选择镜像,按照提示安装操作系统。
这里假设我们把虚拟机 OS 的管理员命名为 yuchanns 。
关闭 swap 和开启 ssh 服务
进入虚拟机 OS ,注意 下面的操作都在虚拟机的 Shell 中执行的。
K8S 官方建议关闭 swap 分区,这里我们选择关闭,免得后续安装 K8S 时出现警告提示。
先执行 sudo swapoff -a
关闭分区,然后去掉 /etc/fstab
中对 swap 的加载(注意! 是注释 /dev/mapper/centos-swap swap
这一行配置,而不是删除掉文件本身)。
#
# /etc/fstab
# Created by anaconda on Sat Apr 3 15:13:29 2021
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root / xfs defaults 0 0
UUID=56bde1b4-7b8d-4b1d-ac9f-51975adefa6e /boot xfs defaults 0 0
# 注释下面这一行
# /dev/mapper/centos-swap swap swap defaults 0 0
上面这一步操作也可以使用
sudo sed -i '/swap/ s/^/#/' /etc/fstab && sudo swapoff -a
代替。
接着设置 ssh 服务的配置文件 /etc/ssh/sshd_config
,主要是"设置监听端口、允许 root 登录和允许账号密码登录"。
# /etc/ssh/sshd_config 关键配置
Port 22 # 取消注释
#AddressFamily any
ListenAddress 0.0.0.0 # 取消注释
ListenAddress :: # 取消注释
# 省略
PermitRootLogin yes # 取消注释
# 省略
PasswordAuthentication yes # 取消注释
启动服务并使用 systemctl 设置开机启动。
bash
sudo service sshd start
sudo systemctl enable sshd.service
关闭防火墙服务和禁用 SELinux 。
bash
sudo systemctl disable firewalld
sudo systemctl stop firewalld
sudo setenforce 0
启用 bridge-nf-call-iptables
。
bash
sudo echo 'net.bridge.bridge-nf-call-iptables = 1' >> /etc/sysctl.conf
Headless 模式
在关闭虚拟机之前,执行 ifconfig
获取到虚拟机的 ip,例如 master 为192.168.31.207, node 为192.168.31.17 关闭虚拟机。
接下来我们通过 Headless 模式启动虚拟机,并在终端使用 ssh 操作 OS 。
注意 下面这段 Shell 命令是在宿主机的终端上执行的。
bash
❯ VBoxManage list vms
"x86" {e1f31c26-84e8-496e-93ce-5cb843368ad4}
"CentOS7-master" {45d4e304-704d-4835-9816-58465a1ce4f7}
❯ VBoxHeadless -s CentOS7-master
Oracle VM VirtualBox Headless Interface 6.1.18
(C) 2008-2021 Oracle Corporation
All rights reserved.
这样虚拟机就在后台启动了。
在宿主机的新终端中执行 ssh [email protected]虚拟机ip
,连接上虚拟机。
下面没有特殊说明,全都是在宿主机终端的 ssh 通信中操作。
安装 Docker
这一部分直接参考阿里云的 Docker CE 镜像源站 手册操作。
bash
# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3: 更新并安装 Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce
# Step 4: 开启Docker服务
sudo service docker start
安装完成之后,使用阿里云的 容器镜像服务 设置 Docker 使用国内镜像源并重启docker刷新配置以及设置开机启动。
bash
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://你申请的镜像源.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo systemctl enable docker
安装 K8S 工具
安装 Kubeadm 工具,并预先拉取 K8S 相关的镜像。
首先配置 yum 国内源,创建 /etc/yum.repos.d/kubernetes.repo
写入如下内容。
yaml
[kubernetes]
name=Kubernetes Repository
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
开始安装 kubelet 、 kubeadm 和 kubectl 等 K8S 工具。
bash
sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
设置 kubelet 开机启动。
bash
systemctl enable kubelet && systemctl start kubelet
配置 Kubeadm 和拉取镜像
首先执行 sudo kubeadm config print init-defaults > init.default.yaml
获取默认的初始化参数文件。
然后参照该文件创建 init-config.yaml
,定制镜像仓库为阿里云仓库(默认使用的是 k8s.gcr.io
)。
yaml
apiVersion: kubeadm.k8s.io/v1beta2
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: v1.20.0
使用配置文件拉取安装 K8S 需要的镜像。
bash
sudo kubeadm config images pull --config=init-config.yaml
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-apiserver:v1.20.0
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-controller-manager:v1.20.0
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-scheduler:v1.20.0
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-proxy:v1.20.0
[config/images] Pulled registry.aliyuncs.com/google_containers/pause:3.2
[config/images] Pulled registry.aliyuncs.com/google_containers/etcd:3.4.13-0
[config/images] Pulled registry.aliyuncs.com/google_containers/coredns:1.7.0
到这里,关闭虚拟机,然后生成快照,以便后续如果有需要可以快速恢复备份,并复制一份命名为 node 。
然后更改两份虚拟机的 hostname,分别命名为 yuchanns-master
和 yuchanns-node-1
。
bash
hostnamectl set-hostname yuchanns-master
安装 K8S
Master
我们先启动 master 虚拟机,安装 K8S Master 。
bash
sudo kubeadm init --config=init-config.yaml
片刻后得到如下输出。
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.31.207:6443 --token hx8f96.5yh392lco45qkd94 \
--discovery-token-ca-cert-hash sha256:cb21467e644298e460e0db036e0472bdce9d87bb5beba6e1453d9f3efa8ebe48
上面的片段告诉我们作为普通用户应该执行的一些命令(如果不执行,将无法使用 kubelet 正确与集群通信),以及 node 集群如何加入 master 的方法。
按照提示,执行命令。
bash
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Node
启动 node
虚拟机,安装 K8S Node 。
这里我们根据安装 Master 时得到的加入提示,创建相应的配置文件 join-config.yml
。
yaml
apiVersion: kubeadm.k8s.io/v1beta2
kind: JoinConfiguration
discovery:
bootstrapToken:
apiServerEndpoint: 192.168.31.207:6443
token: hx8f96.5yh392lco45qkd94
unsafeSkipCAVerification: true
tlsBootstrapToken: hx8f96.5yh392lco45qkd94
然后执行 sudo kubeadm join --config=join-config.yml
。
安装成功!
安装网络插件
master 需要安装网络插件, 这里使用 waves 。
bash
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
然后执行 kubectl get nodes
看到所有集群状态都为 Ready 。
bash
NAME STATUS ROLES AGE VERSION
yuchanns-master Ready control-plane,master 11m v1.20.5
yuchanns-node-1 Ready <none> 8m46s v1.20.5
检查所有 pod 状态是否正常。这里可以看到包括 node 集群的 pod 状态。
bash
kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-7f89b7bc75-2z2lm 1/1 Running 0 11m
kube-system coredns-7f89b7bc75-gz26q 1/1 Running 0 11m
kube-system etcd-yuchanns-master 1/1 Running 0 11m
kube-system kube-apiserver-yuchanns-master 1/1 Running 1 11m
kube-system kube-controller-manager-yuchanns-master 1/1 Running 0 12m
kube-system kube-proxy-p2r8v 1/1 Running 0 9m4s
kube-system kube-proxy-xjzkp 1/1 Running 0 11m
kube-system kube-scheduler-yuchanns-master 1/1 Running 0 11m
kube-system weave-net-9slcj 2/2 Running 0 9m4s
kube-system weave-net-sskbj 2/2 Running 0 10m
如果存在异常,可以使用 kubectl --namespace=kube-system describe pod <pod_name>
的方式查看错误日志。
若安装失败,也可以通过 sudo kubeadm reset
重置再重新安装。