本文操作环境的默认用户为 root
一、环境准备
为了快速搭建,我选用了三台ubuntu的虚拟机,初步规划如下:
操作系统 | 服务器IP | 节点名称 | 角色 |
---|---|---|---|
Ubuntu 18.04 | 192.168.159.101 | kmaster | master节点 |
Ubuntu 18.04 | 192.168.159.102 | knode-1 | worker节点 |
Ubuntu 18.04 | 192.168.159.103 | knode-2 | worker节点 |
Ubuntu 18.04 | 192.168.159.104 | knode-3 | worker节点 |
1.1 安装 SS
由于安装kubernetes在国内的网络环境下,如果没有条件,可能需要采用一些科学上网的工具进行一些网络环境设置,下面我简单列一下:
在我的 4台 Ubuntu 下各执行下面的命令:
sudo apt install python3-pip
pip3 install https://github.com/shadowsocks/shadowsocks/archive/master.zip
1.2 创建 Shadowsocks 配置文件
创建一个 /etc/shadowsocks.json
文件,格式如下
需要事先设置 socks5 服务,相关方法自行google
下面是我的demo配置信息,供参考
{
"server": "我的socks服务地址",
"server_port": 我的socks服务端口,
"local_address": "127.0.0.1",
"local_port": 1080,
"password": "我的密码",
"timeout": 300,
"method": "RC4-MD5",
"fast_open": false
}
1.3 启动 Shadowsocks
Python 版客户端命令是 sslocal , Shadowsocks-libev 客户端命令为 ss-local
/usr/local/bin/sslocal -c /etc/shadowsocks.json -d start
1.4 终端内使用,需安裝 proxychains 或 privoxy
为了在终端中使用代理,还需要安装配置 privoxy (也可以选择 proxychains)
apt-get install privoxy -y
安装完成后编辑 /etc/privoxy/config,搜索关键字 forward-socks5t,取消下面这一行的注释:
forward-socks5t / 127.0.0.1:1080 .
这里 1080 对应着上面 Shadowsocks 配置文件中的“端口号”。
启动 privoxy
systemctl start privoxy
1.5 设置环境变量
4台服务器,分别编辑 ~/.profile,并在文件末尾添加如下内容:
export http_proxy=http://127.0.0.1:8118
export https_proxy=http://127.0.0.1:8118
export ftp_proxy=http://127.0.0.1:8118
export no_proxy=localhost,127.0.0.0,127.0.1.1,127.0.1.1,192.168.159.101,192.168.159.102,192.168.159.103,192.168.159.104,10.0.0.0/8,192.168.0.0/16,mirrors.aliyun.com
export HTTP_PROXY=http://127.0.0.1:8118
export HTTPS_PROXY=http://127.0.0.1:8118
export FTP_PROXY=http://127.0.0.1:8118
export NO_PROXY=localhost,127.0.0.0,127.0.1.1,127.0.1.1,10.0.0.0/8,192.168.159.101,192.168.159.102,192.168.159.103,192.168.159.10,192.168.0.0/16,mirrors.aliyun.com
1.6 关闭swap
编辑/etc/fstab文件,注释掉引用swap的行,保存并重启后输入sudo swapoff -a即可
1.7 开机后台自动运行ss
由于我们想服务器重启后我们的ss服务能自动拉起,所以我们需要借助第三方软件进行后台进程管理,这里我选用了supervisor
sudo apt-get install supervisor
安装好后我们可以在/etc/supervisor/目录下找到supervisor.conf配置文件,我们可以用以下命令来编辑
sudo vim /etc/supervisor/conf.d/shadowsocks.conf
在这个文件的最后加上以下内容
[program:shadowsocks]
command=sslocal -c /etc/shadowsocks.json
autostart=true
autorestart=true
user=root
log_stderr=true
logfile=/var/log/shadowsocks.log
重启suervisor
sudo service supervisor restart
1.8 关闭 ubuntu 防火墙
sudo ufw disable
二、Docker 安装
网络环境配置完后,我们把重心放回kubernetes的核心部件安装,容器运行时是执行容器并在节点上管理容器镜像的软件,目前,最广为人知的容器运行时是Docker,但在生态系统中还有其他容器运行时软件,比如Rkt、Containerd和Lxd。Docker是现在于Kubernetes环境中使用的最常见的容器运行时,所以我这里就默认选用Docker
2.1 安装必要的一些系统工具
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
2.2 安装GPG证书
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
2.3 写入软件源信息
sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
2.4 更新并指定版本安装Docker-CE
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
2.5 设置阿里源
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://xxxxxxx.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
三、使用minikube安装kubernetes集群
安装kubernetes集群,目前主流的有三种方式:minikube、kubeadm、二进制文件安装;
由于二进制安装略有冗长,所以这里我主要介绍前面两种。
3.1 安装Minikube
MiniKube 是使用 Go 语言开发的,所以安装其实很方便,一是通过下载基于不同平台早已编译好的二级制文件安装,二是可以编译源文件安装。
Mac安装
brew cask install minikube
minikube -h
Linux 安装
curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/
minikube -h
3.2 安装Kubectl
kubernetes通过kube-apiserver作为整个集群管理的入口。Apiserver是整个集群的主管理节点,用户通过Apiserver配置和组织集群,同时集群中各个节点同etcd存储的交互也是通过Apiserver进行交互。Apiserver实现了一套RESTfull的接口,用户可以直接使用API同Apiserver交互。但是官方提供了一个客户端kubectl随工具集打包,用于可直接通过kubectl以命令行的方式同集群交互。
curl -Lo kubectl https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl && chmod +x kubectl && sudo mv kubectl /usr/local/bin/
kubectl -h
3.3 启动minikube
由于minikube默认情况下运行需要虚拟机驱动,所以建议我们事先安装好virtualBox软件先,然后可以执行启动:
sudo minikube start
3.4 启动容器服务
sudo kubectl run kube-nginx --image=nginx:latest --port=80
deployment "kube-nginx" created
3.5 发布服务
sudo kubectl expose deployment kube-nginx --type=NodePort
service "kube-nginx" exposed
3.6 服务地址
sudo minikube service kube-nginx --url
http://127.0.0.1:31511
这里展示的地址即启动的nginx容器服务地址,访问http://127.0.0.1:31511 于是便出现nginx首页,服务成功启动.
3.7 启动dashboard管理后台
dashboard是kubernetes提供的容器服务管理后台,可视化界面,用来进行机器负载,集群管理,镜像扩容,配置数据等相关操作
启动dashboard
sudo minikube dashboard --url
四 使用 Kubeadm 安装 Kubernetes
4.1 配置 Docker 的 proxy
我们可以对docker的registry设置阿里云镜像源 (参考 2.5 )
行代理设置,除了这个方法,我们也可以采用下面的方式:
Kubernetes 的一些 docker 镜像是需要借助梯子才能拉取到的,为此需要为 Docker 配置 Proxy。
参考 https://docs.docker.com/config/daemon/systemd/#httphttps-proxy
配置文件 /etc/systemd/system/docker.service.d/http-proxy.conf 内容如下:
[Service]
Environment="HTTP_PROXY=http://127.0.0.1:8118/"
Environment="NO_PROXY=localhost,127.0.0.0/8,10.0.0.0/8,192.168.0.0/16,xxxxxxx.mirror.aliyuncs.com"
重启 docker
sudo systemctl daemon-reload
sudo systemctl restart docker
4.2 安装Kubernetes(所有虚拟机)
如果你已经使用Minikube安装了k8s,那么kubectl命令会有一份配置文件存在 $HOME/.kube目录下,需要删除才可以使用kubeadm安装
添加软件源
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF
更新软件包缓存并安装
apt-get update
apt-get install -y kubelet kubeadm kubectl kubernetes-cni
apt-mark hold kubelet kubeadm kubectl
启用kubelet
systemctl enable kubelet && systemctl start kubelet
(可选) 添加到变量到 /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
Environment="cgroup-driver=systemd/cgroup-driver=cgroups"
4.3 使用kubeadm init初始化master节点
kubeadm init 前最好删除 $HOME/.kube目录
下面提供两种网络插件安装方式,选其中一种即可
calico 网络
kubeadm init --apiserver-advertise-address 192.168.159.101 --pod-network-cidr=192.168.0.0/16
Flannel网络
kubeadm init --apiserver-advertise-address 192.168.159.101 --pod-network-cidr=10.244.0.0/16
配置文件方式(可选)
执行 kubeadm config print init-defaults 可以取得默认的初始化参数文件
kubeadm config print init-defaults > init.default.yml
对生成的文件进行编辑,可以按需生成合适的配置,例如,若需要定制镜像仓库地址、以及Pod的地址范围,则可以使用如下配置
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
imageRepository: docker.io/dustine
kubernetesVersion: v1.14.0
networking:
podSubnet:"192.168.0.0/16"
将上面的内容保存为init-config.yaml 备用
4.4 init 常用主要参数:
- kubernetes-version: 指定Kubenetes版本,如果不指定该参数,会从google网站下载最新的版本信息。
- pod-network-cidr: 指定pod网络的IP地址范围,它的值取决于你在下一步选择的哪个网络网络插件,比如我在本文中使用的是 flannel 网络,需要指定为10.244.0.0/16。
- apiserver-advertise-address: 指定master服务发布的Ip地址,如果不指定,则会自动检测网络接口,通常是内网IP。 kubeadm init 输出的token用于master和加入节点间的身份认证,token是机密的,需要保证它的安全,因为拥有此标记的人都可以随意向集群中添加节点。
安装过程中,可能会出现下面的错误
[init] Using Kubernetes version: v1.15.0
[preflight] Running pre-flight checks
[WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/
[preflight] Pulling images required for setting up a Kubernetes cluster
[preflight] This might take a minute or two, depending on the speed of your internet connection
[preflight] You can also perform this action in beforehand using 'kubeadm config images pull'
error execution phase preflight: [preflight] Some fatal errors occurred:
[ERROR ImagePull]: failed to pull image k8s.gcr.io/kube-apiserver:v1.15.0: output: Error response from daemon: Get https://k8s.gcr.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
, error: exit status 1
[ERROR ImagePull]: failed to pull image k8s.gcr.io/kube-controller-manager:v1.15.0: output: Error response from daemon: Get https://k8s.gcr.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
, error: exit status 1
[ERROR ImagePull]: failed to pull image k8s.gcr.io/kube-scheduler:v1.15.0: output: Error response from daemon: Get https://k8s.gcr.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
, error: exit status 1
[ERROR ImagePull]: failed to pull image k8s.gcr.io/kube-proxy:v1.15.0: output: Error response from daemon: Get https://k8s.gcr.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
, error: exit status 1
[ERROR ImagePull]: failed to pull image k8s.gcr.io/pause:3.1: output: Error response from daemon: Get https://k8s.gcr.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
, error: exit status 1
[ERROR ImagePull]: failed to pull image k8s.gcr.io/etcd:3.3.10: output: Error response from daemon: Get https://k8s.gcr.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
, error: exit status 1
[ERROR ImagePull]: failed to pull image k8s.gcr.io/coredns:1.3.1: output: Error response from daemon: Get https://k8s.gcr.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
, error: exit status 1
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
新版本的Kubernetes在安装部署中,需要从k8s.grc.io仓库中拉取所需镜像文件,但由于国内网络防火墙问题导致无法正常拉取
docker.io仓库对google的容器做了镜像,可以通过下列命令下拉取相关镜像:
建议 master 和 node 节点也安装下面的镜像
否则node节点可能由于墙的原因,在加入集群的时候可能会报下面的错误
Container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized
因为每个node节点,需要 k8s.gcr.io/pause
、kube-proxy
、calico/fannel等插件
等相关启动容器的支持才能正常工作
下面是镜像安装脚本
vim imagespull.sh
docker pull mirrorgooglecontainers/kube-apiserver:v1.15.0
docker pull mirrorgooglecontainers/kube-controller-manager:v1.15.0
docker pull mirrorgooglecontainers/kube-scheduler:v1.15.0
docker pull mirrorgooglecontainers/kube-proxy:v1.15.0
docker pull mirrorgooglecontainers/pause:3.1
docker pull mirrorgooglecontainers/etcd:3.3.10
docker pull coredns/coredns:1.3.1
docker tag docker.io/mirrorgooglecontainers/kube-proxy:v1.15.0 k8s.gcr.io/kube-proxy:v1.15.0
docker tag docker.io/mirrorgooglecontainers/kube-scheduler:v1.15.0 k8s.gcr.io/kube-scheduler:v1.15.0
docker tag docker.io/mirrorgooglecontainers/kube-apiserver:v1.15.0 k8s.gcr.io/kube-apiserver:v1.15.0
docker tag docker.io/mirrorgooglecontainers/kube-controller-manager:v1.15.0 k8s.gcr.io/kube-controller-manager:v1.15.0
docker tag docker.io/mirrorgooglecontainers/etcd:3.3.10 k8s.gcr.io/etcd:3.3.10
docker tag docker.io/mirrorgooglecontainers/pause:3.1 k8s.gcr.io/pause:3.1
docker tag docker.io/coredns/coredns:1.3.1 k8s.gcr.io/coredns:1.3.1
sh imagespull.sh
最后,kubeadm init 执行后,如出现下面的信息,表示安装成功
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
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.159.101:6443 --token 82e1nv.rtjfhtg2yufmvxfe \
--discovery-token-ca-cert-hash sha256:5caf354a1ec5dc2ba220b38f71b2a8b11d767be1ffcd12cc0c04336986599d8c
按照提示执行下面的命令,复制配置文件到普通用户的home目录下
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
4.5 安装网络插件
安装一个网络插件是必须的,因为你的pods之间需要彼此通信。
网络部署必须是优先于任何应用的部署,详细的网络列表可参考插件页面。
上面在 kubeadm init
的时候根据选择的网络模型方式,选择下面其中对应的安装
下面的插件二选一进行安装:
Calico
如果使用的是 calico 网络,安装如下:
kubectl apply -f https://docs.projectcalico.org/v3.7/manifests/calico.yaml
Flannel
如果使用的是 flannel 网络,安装如下:
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
观察是否配置成功
kubectl get pods -o wide --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
kube-system calico-kube-controllers-6fb584dd97-dpll4 1/1 Running 0 43s 192.168.189.3 kmaster <none> <none>
kube-system calico-node-t4xxf 1/1 Running 0 43s 192.168.159.101 kmaster <none> <none>
kube-system coredns-5c98db65d4-fcdx9 1/1 Running 0 86s 192.168.189.2 kmaster <none> <none>
kube-system coredns-5c98db65d4-pcsmk 1/1 Running 0 86s 192.168.189.1 kmaster <none> <none>
kube-system etcd-kmaster 1/1 Running 0 18s 192.168.159.101 kmaster <none> <none>
kube-system kube-apiserver-kmaster 1/1 Running 0 25s 192.168.159.101 kmaster <none> <none>
kube-system kube-controller-manager-kmaster 1/1 Running 0 38s 192.168.159.101 kmaster <none> <none>
kube-system kube-proxy-dd4kk 1/1 Running 0 85s 192.168.159.101 kmaster <none> <none>
kube-system kube-scheduler-kmaster 1/1 Running 0 28s 192.168.159.101 kmaster <none> <none>
kubectl get nodes
NAME STATUS ROLES AGE VERSION
kmaster Ready master 2m11s v1.15.0
4.6 添加从节点
在从节点上按照前面的步骤按照好docker和kubeadm后,就可以添加从节点到主节点上了
kubeadm join 192.168.159.101:6443 --token 82e1nv.rtjfhtg2yufmvxfe --discovery-token-ca-cert-hash sha256:5caf354a1ec5dc2ba220b38f71b2a8b11d767be1ffcd12cc0c04336986599d8c
回到master节点查看集群状态
kubectl get nodes
NAME STATUS ROLES AGE VERSION
kmaster Ready master 35m v1.15.0
knode-1 Ready <none> 69s v1.15.0
这样一个节点添加成功,我们同时把其它节点添加进来就可以了
我们可以手动给任意 node 设置 ROLES
原理就是给 node 打标签, 只不过是特殊的标签
kubectl label node knode-1 node-role.kubernetes.io/worker=worker
kubectl label node knode-2 node-role.kubernetes.io/worker=worker
kubectl label node knode-3 node-role.kubernetes.io/worker=worker
kubectl get nodes
NAME STATUS ROLES AGE VERSION
kmaster Ready master 34m v1.15.0
knode-1 Ready worker 29m v1.15.0
knode-2 Ready worker 28m v1.15.0
knode-3 Ready worker 28s v1.15.0
4.7 安装 Dashboard 插件
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/aio/deploy/recommended/kubernetes-dashboard.yaml
修改service通过NodePort方式访问k8s dashboard
小技巧,由于后面的操作都是在 kube-system 名称空间中进行,可以设置个别名 ksys=kubectl -n kube-system 这样就可以使用ksys操作该名称空间了
alias ksys='kubectl -n kube-system'
ksys get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 3h43m
kubernetes-dashboard NodePort 10.102.227.67 <none> 443/TCP 3h39m
可以看到 kubernetes-dashboard service 在集群内部,无法再外部访问,为了方便访问,我们暴露kubernetes-dashboard 443端口给NodePort ksys edit svc kubernetes-dashboard 通过ksys edit svc 直接编辑service
ksys edit svc kubernetes-dashboard
把 type: ClusterIp 改为 type: NodePort。 参考如下
... ...
spec:
clusterIP: 10.102.227.67
externalTrafficPolicy: Cluster
ports:
- nodePort: 31537
port: 443
protocol: TCP
targetPort: 8443
selector:
k8s-app: kubernetes-dashboard
sessionAffinity: None
type: NodePort
... ...
这时,我们再重新查看Service
ksys get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 3h45m
kubernetes-dashboard NodePort 10.102.227.67 <none> 443:31537/TCP 3h41m
可以看到当前NodePort 端口是随机的31537,通过ifconfig 查看节点ip地址,该节点ip为:192.168.159.101
通过谷歌浏览器访问 https://192.168.159.101:31537
创建kubernetes-dashboard管理员角色
kubectl create serviceaccount dashboard -n default
然后
kubectl create clusterrolebinding dashboard-admin -n default --clusterrole=cluster-admin --serviceaccount=default:dashboard
最后生成token
kubectl get secret $(kubectl get serviceaccount dashboard -o jsonpath="{.secrets[0].name}") -o jsonpath="{.data.token}" | base64 --decode
生成的token如下:
eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImRhc2hib2FyZC10b2tlbi01d2s3NiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJkYXNoYm9hcmQiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiJkOWM5ZGZiNS0yOTgyLTQzMzMtYjE0ZC1jYjY1ODAwYzVmZjciLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6ZGVmYXVsdDpkYXNoYm9hcmQifQ.krpa4umk2aPO8OAIvVJvwmGcO-CKrpEwiGxriSu7iYmoM8qiBqtic8YbQpVtoW4I6orCvflOH1xzO4fJp2h7r-ElFUqCBLO6trm3ZsrbdfiewOPMlk6BN4wKH1E6DbkTycR_BbalxJqpSrBM19LZgjTAsLoUqMIaNr51vQGNhQCRS8lUfJRAbWA7GRspUz_rbFSNbtIKzFZWbyP1r_yY253e7lof8K7sf0WEUpSkf2pTyQXfe57bY_QyGl3J-k_a5mv4zqzu_9kDoD3jmHxBDq292lK1FzY17fMpwuR4lMCzoanx68gFvexNpZ_1oPbIs2eEPOTQ12Ew923zMYzBTw
把这个toke贴到上面的登录页的令牌框中,点击确认页面成功调整到管理页面
以后,我们直接通过浏览器访问 https://192.168.159.101:31537/#!/cluster?namespace=default 就能进入管理后台
4.8 查看日志
journalctl -f -u kubelet
4.9 备注
如果安装失败,可以使用 kubeadm reset
命令将主机恢复原状,重新执行 kubeadmin init
命令进行安装
如果需要node节点重装可以使用下面的命令(个人偏好,不代表规范操作)
rm -rf /var/lib/kubelet/* && rm -rf /etc/kubernetes/* && systemctl stop kubelet
apt-get purge kubelet kubeadm kubectl && apt-get install kubelet kubeadm kubectl
systemctl enable kubelet && systemctl start kubelet
总结
根据上面的安装指引,基本能搭建起一个四节点的kubernetes集群,接下来我们可以从集群环境出发根据kubernetes的相关知识点不断学习不断演练,加深对这个优秀开源软件的学习