使用 kubeadm
工具在虚拟机上安装一个 ALL-In-One
类型的 Kubernetes
集群环境,也就是指这个环境中主要是安装了 Master
,但是也可以作为一个 Node 节点使用。
-
创建一台虚拟机
- 本人使用
VMWare Fusion
创建Centos 7.8
虚拟机) - 配置最小为 2 核 4GB 内存(
Kubernetes
文档规定) - 选择任意桌面模式即可
- 本人使用
-
打通与宿主机的网络连接
- 使用
NAT
模式无法设置静态IP
,所以选择桥接模式。 - 若两边互通,获取虚拟机
IP
地址,使用ssh
工具连接 root 用户,设置虚拟机IP
地址为静态。
#修改虚拟机以太网配置文件一般为 ens33 $ vim /etc/sysconfig/network-scripts/ifcfg-ens33
Ifcfg-ens33
修改如下:TYPE=Ethernet PROXY_METHOD=none BROWSER_ONLY=no #设置静态网络 BOOTPROTO=static DEFROUTE=yes IPV4_FAILURE_FATAL=no IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_FAILURE_FATAL=no IPV6_ADDR_GEN_MODE=stable-privacy NAME=ens33 UUID=3062611e-41b4-4eef-8296-4fe929af8918 DEVICE=ens33 #开机启动 ONBOOT=yes #设置IP地址、子网掩码、网关和DNS (DNS选择一个有名的即可) #每个机器上的IP地址不一,请在虚拟机使用 `ifconfig` 获取 IPADDR=192.168.3.61 NETMASK=255.255.255.0 GATEWAY=192.168.3.1 DNS1=119.29.29.29
- 重启网络服务,并自行测试与外网和宿主机的连通性
$ systemctl restart network.service
- 使用
-
安装
Docker
- 阿里镜像站有配套资源与安装方式
-
配置内核模块和内核参数,并关闭
swapoff
:cat >> /etc/modules <<EOF ip_vs_rr ip_vs_wrr ip_vs_sh nf_conntrack_ipv4 br_netfilter EOF cat > /etc/sysctl.d/k8s.conf <<EOF net.ipv4.ip_forward = 1 vm.swappiness = 0 net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF swapoff -a sed -i 's/.*swap.*/#&/' /etc/fstab
-
安装
ipvsadm
和ipset
$ yum install -y ipvsadm ipset
-
安装
kubeadm
、kubelet
、kubectl
- 阿里镜像站有配套资源与安装方式
-
配置
Docker
,注意mirrors
的配置,关闭对iptables
的配置。cat > /etc/docker/daemon.json <<EOF { "registry-mirrors": ["https://7uvhrdbm.mirror.aliyuncs.com"], "storage-driver": "overlay2", "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "20m" } } EOF sudo systemctl daemon-reload sudo systemctl restart docker
-
设置节点主机名为 kube-master:
hostnamectl --static set-hostname kube-master reboot # 修改节点名后需要重启才能生效
-
将节点的内网 IP/主机名加入 hosts 解析。
192.168.3.61 kube-master
-
关闭
firewalld
$ systemctl stop firewalld $ systemctl disable firewalld $ modprobe br_netfilter
-
使用
kubeadm
初始化集群,指定pod
网段为flannel
的默认网段$ kubeadm init --image-repository registry.aliyuncs.com/google_containers --kubernetes-version <对应版本>(如v1.19.2) --pod-network-cidr=10.244.0.0/16
当集群初始化成功后,可以看到 kubeadm 已经提供如何在其中工作节点通过
kubeadm join
命令加入集群(可以记录下面以备后面的使用)。 -
复制 kubectl 相关配置文件
mkdir -p $HOME/.kube cp -i /etc/kubernetes/admin.conf $HOME/.kube/config chown $(id -u):$(id -g) $HOME/.kube/config
-
验证创建成功
[root@kube-master ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION kube-master NotReady master 2m40s v1.15.5 [root@kube-master ~]# kubectl get pods -n kube-system NAME READY STATUS RESTARTS AGE coredns-bccdc95cf-f2v2g 0/1 Pending 0 2m22s coredns-bccdc95cf-rvbnt 0/1 Pending 0 2m22s etcd-kube-master 1/1 Running 0 101s kube-apiserver-kube-master 1/1 Running 0 85s kube-controller-manager-kube-master 1/1 Running 0 75s kube-proxy-4f8n4 1/1 Running 0 2m22s kube-scheduler-kube-master 1/1 Running 0 92s
-
安装 网络插件
flannel
由于
flannel
使用的镜像默认托管在quay.io
上,有时国内访问速度可能会比较慢,所以可以先通过其他渠道将镜像拉取到本地,避免后续部署失败。在从mirror
拉取镜像时,需要先看下flannel.yaml
文件中指定的镜像版本是什么。$ docker pull registry.cn-hangzhou.aliyuncs.com/chenshi-kubernetes/flannel:v0.12.0-amd64 $ docker tag registry.cn-hangzhou.aliyuncs.com/chenshi-kubernetes/flannel:v0.12.0-amd64 quay.io/coreos/flannel:v0.12.0-amd64 $ wget https://labfile.oss.aliyuncs.com/courses/1494/kube-flannel.yml $ kubectl create -f kube-flannel.yml
-
此时可以再次执行
kubectl get pods -n kube-system
验证网络插件是否部署成功,可以看到 coredns pod 已经变为 running 状态。 -
移除
master
节点的taint
kubeadm
在Master
上也安装了kubelet
,在默认情况下不参与工作负载,可以执行下面的命令让Master
成为一个Node
。$ kubectl taint nodes kube-master node-role.kubernetes.io/master-
-
部署 Nginx 验证集群
[root@kube-master ~]# kubectl create deployment nginx --image=nginx deployment.apps/nginx created [root@kube-master ~]# kubectl expose deploy nginx --type=NodePort --port=8080 --target-port=80 --name=nginx-svc service/nginx-svc exposed
- 查看创建的
pod
、deployment
以及service
:
[root@kube-master ~]# kubectl get pods NAME READY STATUS RESTARTS AGE nginx-554b9c67f9-n7tgx 1/1 Running 0 9m41s [root@kube-master ~]# kubectl get deployments NAME READY UP-TO-DATE AVAILABLE AGE nginx 1/1 1 1 9m50s [root@kube-master ~]# kubectl get services NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 30m nginx-svc NodePort 10.97.22.179 <none> 8080:31001/TCP 18m
- 可以发现
nginx
服务暴露在集群IP
10.97.22.179
的8080
端口上,下面在节点上使用curl
可以访问到nginx
:
[root@kube-master ~]# curl 10.97.22.179:8080 <html> <head> <title>Welcome to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>
- 查看创建的
评论区