现在很多的 K8S 部署是通过容器安装的,这里介绍如何在物理机上独立部署,这也是最简单的方式。
组件组成
可以通过 kubeadm 更简单安装,实际上是通过容器进行部署,相比来说要简单很多,通过 kubeadm config images list 查看其依赖的镜像列表,如果要离线安装,那么就需要提前准备好。另外,还可以使用 kind 进行部署。
K8S 主要包含了 Master 和 Nodes 两种类型的节点,不同类型节点包含的服务不同。
----- Master 节点
etcd 用来保存集群的元数据,保证数据的一致性以及高可用。
kube-apiserver 对外提供API服务,是 K8S 入口服务,会进行鉴权、认证等操作。
kube-scheduler 资源调度
kube-controller-manager 管理控制器
----- Nodes 节点
kubelet 确保容器运行,管理由 K8S 创建的容器
kube-proxy 维护容器的网络规则
docker 容器运行环境
包含了 UnSecret 以及 Secret 两个版本,前者是不包含鉴权、权限等功能的,仅做简单的功能测试。
组件安装
所有与 K8S 相关的组件安装在 /opt/k8s
目录下,包括数据、执行文件等,可以单机安装或通过 VirtualBox 安装。另外,出于安全的考虑,类似 insecure-port
参数在 v1.20.x
中移除,所以这里建议使用 v1.19.x
版本。
也可以参考如下的安全加固方式。
环境准备
如果使用 VirtualBox 搭建环境,那么需要确认 MAC 和 UUID 不同,如下是 CentOS 中的配置。
ifconfig
cat /sys/class/dmi/id/product_uuid
----- 停止防火墙
systemctl status firewalld
systemctl stop firewalld
systemctl disable firewalld
----- 关闭 SELinux ,如果要完全关闭需要重启,建议先重启
sestatus -v
setenforce 0
sed -i 's/enforcing/disabled/' /etc/selinux/config
----- 关闭Swap
swapon -s
swapoff -a
vim /etc/fstab
----- 为了方便使用,新增主机名映射关系
cat /etc/hosts
192.168.56.107 master
192.168.56.108 slave1
192.168.56.110 slave2
----- 修改Node主机名,直接修改/etc/hostname即可,可以通过如下命令删除Node
/opt/bin/kubectl --server=192.168.56.107:8080 delete node localhost.localdomain
----- 添加默认网关,临时添加重启后会失效
route add default gw 192.168.56.1
----- 永久配置,网上有很多的配置,实际生效的为 static-routes 配置文件
/etc/sysconfig/network
/etc/sysconfig/network-scripts/route-enp0s3
/etc/sysconfig/static-routes XXX
default via 192.168.56.1 dev enp0s3
192.168.56.0/255.255.255.0 via 192.168.56.1 dev enp0s3
如果是本地,则可以使用本地回环不同网段。
另外,在调试时,可以通过 -v=8
设置日志级别,这是显示最为详细的日志配置。
etcd (master)
直接从 GitHub 下载安装包,增加 etcd
的 systemd
服务配置文件,其对应路径为 /usr/lib/systemd/system/etcd.service
文件,内容如下。
[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target
[Service]
Type=notify
WorkingDirectory=/opt/k8s/data/etcd
ExecStart=/opt/k8s/bin/etcd --enable-v2 \
--data-dir=/opt/k8s/data/etcd \
--listen-peer-urls=http://192.168.56.107:2380 \
--listen-client-urls=http://192.168.56.107:2379 \
--advertise-client-urls=http://192.168.56.107:2379
#---> for local
# --listen-peer-urls=http://127.0.9.100:2380 \
# --listen-client-urls=http://127.0.9.100:2379 \
# --advertise-client-urls=http://127.0.9.100:2379
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
如下是常用的配置参数。
listen-peer-urls
集群内部通讯地址。advertise-client-urls
listen-client-urls
客户端连接地址。
安装启动完之后可以通过 /opt/k8s/bin/etcdctl --endpoints=http://192.168.56.107:2379 endpoint health
命令查看服务是否正常,如下是常见的命令。
systemctl start etcd
systemctl status etcd
systemctl enable etcd
systemctl daemon-reload
KubeAPIServer (master)
对应 /usr/lib/systemd/system/kube-apiserver.service
文件。
[Unit]
Description=kube-apiserver Server
After=network.target
After=network-online.target
Wants=network-online.target
[Service]
ExecStart=/opt/k8s/bin/kube-apiserver \
--v=2 --log-dir=/opt/k8s/log/apiserver --logtostderr=false \
--allow-privileged=true \
--insecure-port=8080 \
--insecure-bind-address=192.168.56.107 \
--etcd-servers=http://192.168.56.107:2379 \
--admission-control=NamespaceLifecycle,LimitRanger,SecurityContextDeny,ResourceQuota
#---> for local
# --insecure-bind-address=127.0.9.101 \
# --etcd-servers=http://127.0.9.100:2379 \
Restart=on-failure
[Install]
WantedBy=multi-user.target
其中参数为。
allow-privileged=true
是否允许特权容器,可以查看 docker 的特性。
通过 /opt/k8s/bin/kubectl --server=192.168.56.107:8080 get cs
可以看到 ectd 服务已经正常。
systemctl start kube-apiserver
systemctl status kube-apiserver
systemctl enable kube-apiserver
systemctl daemon-reload
KubeControllerManager(master)
对应 /usr/lib/systemd/system/kube-controller-manager.service
文件。
[Unit]
Description=kube-controller-manager
After=network.target
After=network-online.target
Wants=network-online.target
[Service]
ExecStart=/opt/k8s/bin/kube-controller-manager \
--master=192.168.56.107:8080 \
--v=2 --log-dir=/opt/k8s/log/controller --logtostderr=false
#---> for local
# --master=127.0.9.101:8080 \
Restart=on-failure
[Install]
WantedBy=multi-user.target
启动后同样可以通过如上命令检查是否正常。
systemctl start kube-controller-manager
systemctl status kube-controller-manager
systemctl enable kube-controller-manager
systemctl daemon-reload
KubeScheduller(master)
对应 /usr/lib/systemd/system/kube-scheduler.service
文件。
[Unit]
Description=kube-scheduler
After=network.target
After=network-online.target
Wants=network-online.target
[Service]
ExecStart=/opt/k8s/bin/kube-scheduler \
--master=192.168.56.107:8080 \
--v=2 --log-dir=/opt/k8s/log/scheduler --logtostderr=false
#---> for local
# --master=127.0.9.101:8080 \
Restart=on-failure
[Install]
WantedBy=multi-user.target
启动后同样可以通过如上命令检查是否正常。
systemctl start kube-scheduler
systemctl status kube-scheduler
systemctl enable kube-scheduler
systemctl daemon-reload
KubeProxy(slave)
对应 /usr/lib/systemd/system/kube-proxy.service
文件。
[Unit]
Description=kube-proxy
After=network.target
After=network-online.target
Wants=network-online.target
[Service]
ExecStart=/opt/k8s/bin/kube-proxy \
--master=192.168.56.107:8080 \
--v=2 --log-dir=/opt/k8s/log/proxy --logtostderr=false
#--> for local
# --master=127.0.9.101:8080 \
Restart=on-failure
[Install]
WantedBy=multi-user.target
systemctl start kube-proxy
systemctl status kube-proxy
systemctl enable kube-proxy
systemctl daemon-reload
Kubelet(slave)
对应 /usr/lib/systemd/system/kubelet.service
文件。
[Unit]
Description=kubelet
After=network.target
After=network-online.target
Wants=network-online.target
[Service]
ExecStart=/opt/k8s/bin/kubelet \
--v=2 --log-dir=/opt/k8s/log/kubelet --logtostderr=false \
--cluster-dns=10.0.0.3 --cluster-domain=cluster.local \
--kubeconfig=/opt/k8s/kubelet/config --cgroup-driver=cgroupfs
CPUAccounting=true
MemoryAccounting=true
Restart=on-failure
[Install]
WantedBy=multi-user.target
其中 cgroup-driver
对应的值要与 docker
保持一致,后者可以从 /etc/docker/daemon.json
文件查看。
systemctl start kubelet
systemctl status kubelet
systemctl enable kubelet
systemctl daemon-reload
apiVersion: v1
kind: Config
clusters:
- name: scratch
cluster:
insecure-skip-tls-verify: true
server: http://192.168.56.107:8080
contexts:
- name: default
context:
user: kubelet
cluster: scratch
current-context: default
参考
- Download Kubernetes 可以下载容器镜像或者二进制文件。