K8S 简单安装部署服务

2021-05-04 container k8s

现在很多的 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 下载安装包,增加 etcdsystemd 服务配置文件,其对应路径为 /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

参考