(图:master 和 node 各需要什么服务,如何通信)
master 节点环境准备
master 节点需要以下四个服务:
- etcd, 作为默认的持久化存储
- apiserver, apiserver 在哪里,哪里就是 master 节点
- controller-manager, 用于控制
- scheduler, 用于调度
安装 ETCD
- 安装
yum install etcd -y
- 改配置
vim /etc/etcd/etcd.conf
- 将
ETCD_LISTEN_CLIENT_URLS
的 localhost 改为 0.0.0.0 (开启远程也可以访问) - 将
ETCD_ADVERTISE_CLIENT_URLS
的 Localhost 改为本机 IP 172.16.156.128 - 阅读一下其他配置,如 ETCD_DATA_DIR,ETCD_NAME (集群环境中用的)
- 将
- 启动
systemctl start etcd.service
- 设置开机自启动
systemctl enable etcd.service
通过 netstat -lntup
查看 etcd 占用端口有两个:2379、2380。
- 2379 对所有IP开放是因为他是写数据用对;
- 2380 只对自己主机开放。
注:netstat 在 macOS 上和 linux 上的使用好像不一样。回头要学习一下。
ETCD 是个高度一致的分布式键值存储,ectdctl 是一个客户端工具。k8s 使用了 ETCD 持久化存储了配置信息。 基本使用:
etcdctl ls [etcd_dir] # 一层一层列出目录 etcdctl get <dir> # 显示目录存储的数据
新装 etcd 遇到错误
read wal error
解决方法:
直接现象:kube-apiserver 启动一直失败。一个个调查发现 systemctl 启动 etcd 也失败了
通过journalctl -xe -u etcd
查看 etcd 的信息,最后看到一条read wal error (proto: Record: illegal tag 0 (wire type 0)) and cannot be repaired
信息
偶然从ETCD_DATA_DIR
目录中看到此目录并尝试将其删除rm /var/lib/etcd/default.etcd/member/wal/*
,重新启动 etcd 成功(这个像是发 rpc 的 protobuf)
修复之后 kube-apiserver 启动也成功了。
安装 k8s-master
安装命令
yum install kubernetes-master.x86_64 -y
此命令会安装依赖包 kubernetes-client 包,这个包中包含 kubectl 命令。
通过这种方式和其它方式可能还不一样,当前这种方式安装的是
kubectl --version
:Kubernetes v1.5.2
版本。
编辑配置
- apiserver 的配置文件是
/etc/kubernetes/apiserver
- controller-manager、scheduler 共用一个配置文件
/etc/kubernetes/config
编辑 apiserver 配置
apiserver文件 config文件启动三个服务
systemctl start kube-apiserver.service # 启动
systemctl enable kube-apiserver.service # 开机自启动
systemctl start kube-controller-manager.service
systemctl enable kube-controller-manager.service
systemctl start kube-scheduler.service
systemctl enable kube-scheduler.service
node 节点环境准备
node 节点提供服务需要有两个服务: kubelet 和 kube-proxy
由于本案例中 master 节点也作为一个 node 提供服务,所以在 master 节点上也同样需要执行以下安装操作。
yum install kubernetes-node.x86_64 -y
安装过程中会给节点自动安装 docker。
配置
各节点配置 Kubelet (/etc/kubernetes/kubelet)。
- master 节点是通过 api-server 与各节点的 kubelet 通信,故 kubelet 配置的端口需要和 master 中保持一致(当前是 10250).
另外配置 kubelet 的访问地址为对外的 IP(外界用此 IP 可访问)
KUBELET_HOSTNAME 是通过 域名来访问 IP,需要做 host 解析(/etc/hosts)
配置 KUBELET_API_SERVER 的地址
kubelet 配置启动服务
启动 Kubelet 会自动启动 docker,查看 docker 启动状态用命令 systemctl status docker
。
systemctl start kubelet.service # 启动kubelet
systemctl enable kubelet.service # 设置开机自启
systemctl start kube-proxy.service # 启动 kube-proxy
systemctl enable kube-proxy.service # 设置开机自启
查看节点
在 master 上执行以下命令查看所有节点:
kubectl get nodes
截屏2022-03-13 下午11.18.29.png
网友评论