Docker K8s 02 环境部署(软件包工具)

安装方法

可以选择使用软件包工具(yum, apt, rpm 文件, deb 文件等), 下载二进制包, 编译源代码, 以及 kubeadm(位于二进制包中) 快速安装.

由于测试使用的是 CentOS 7.x, 本次我们选择使用软件包工具 yum 安装.

节点规划

当前手里有 4 台闲置机器, 按照 IP 地址末位, 我们暂且称其为 7,8,9,10. 我们将 7 作为 Master 节点, 其余作为 Node 节点.

Master 软件: kubernetes-master etcd
Node 软件: kubernetes-node etcd flannel docker

master + node 共同组成 etcd 集群.

前期准备

1. 查看 SELinux, 禁用之

1
2
3
4
cat /etc/selinux/config | grep SELINUX

# 将 `enforcing` 改为 `disabled`
sed -i -e "s/SELINUX=enforcing/SELINUX=disabled/" /etc/selinux/config

2. 查看防火墙, 禁用之

由于测试, 暂时不考虑防火墙问题, 并且由于使用云服务器, 防火墙完全可以在云端后台层去做.

1
2
3
4
sudo systemctl status firewalld

sudo systemctl stop firewalld
sudo systemctl disable firewalld

3. 更新软件包, 同步系统时间

1
2
sudo yum update -y
sudo ntpdate -u cn.pool.ntp.org

安装软件

全部节点安装 etcd

1
sudo yum install etcd -y

Master 节点安装 kubernetes-master

1
sudo yum install kubernetes-master -y

Node 节点安装 kubernetes-node flannel docker

1
sudo yum install kubernetes-node flannel docker -y

出现 Docker 与原来版本的冲突问题

由于另一篇文章: CentOS 安装 Docker, Compose, Machine, Swarm 对 Docker 的安装, 使用的是官方的源, 可能由于版本问题, 造成冲突

1
2
3
4
错误:docker-ce-cli conflicts with 2:docker-1.13.1-103.git7f2769b.el7.centos.x86_64
错误:docker-ce conflicts with 2:docker-1.13.1-103.git7f2769b.el7.centos.x86_64
您可以尝试添加 --skip-broken 选项来解决该问题
您可以尝试执行:rpm -Va --nofiles --nodigest

如果出现冲突, 可以选择卸载原来的 docker, 然后使用 yum 进行重新安装.

1
2
3
4
5
6
7
8
9
10
11
12
# 删除旧版
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine -y
# 删除 Community 版本
sudo yum remove docker-ce docker-ce-cli containerd.io -y
sudo rm -rf /var/lib/docker

参考文档:

配置 Etcd

位置 /etc/etcd/etcd.conf

我们先不求甚解一下, 里面很多配置, 我们暂且只关注下面的几个, 默认值如下

  • ETCD_DATA_DIR 数据存储位置
  • ETCD_LISTEN_PEER_URLS etcd 节点监听的 URL, 与分布式其他节点通信
  • ETCD_LISTEN_CLIENT_URLS etcd 节点对外提供服务的地址, 以逗号间隔
  • ETCD_NAME 节点名称, 集群中唯一标识
  • ETCD_INITIAL_ADVERTISE_PEER_URLS 集群中其他节点地址列表, 以逗号间隔
  • ETCD_ADVERTISE_CLIENT_URLS 告诉集群其他节点, 自己对外提供服务的地址
  • ETCD_INITIAL_CLUSTER 初始化组网的所有服务器地址

线上实际配置文件, 其中变量为各自 IP 地址尾号 7, 8, 9, 10.

1
2
3
4
5
6
7
8
9
10
11
# 不变
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
# 集群中唯一命名
ETCD_NAME="etcd{$IP}"
# 改为本机 IP
ETCD_LISTEN_PEER_URLS="http://192.168.1.{$IP}:2380"
ETCD_LISTEN_CLIENT_URLS="http://192.168.1.{$IP}:2379,http://127.0.0.1:2379"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.1.{$IP}:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.1.{$IP}:2379"
# 改为机器列表
ETCD_INITIAL_CLUSTER="etcd7=http://192.168.1.7:2380,etcd8=http://192.168.1.8:2380,etcd9=http://192.168.1.9:2380,etcd10=http://192.168.1.10:2380"

启动 etcd 服务

1
2
3
4
5
6
7
8
9
# 启动
sudo systemctl enable etcd
sudo systemctl restart etcd

# 查看启动状态
sudo systemctl status etcd

# 查看集群状态
etcdctl cluster-health

配置 Master 节点

配置 /etc/kubernetes/apiserver 文件

1
2
3
4
5
6
7
8
9
10
11
# 监听 IP 地址
KUBE_API_ADDRESS="--address=0.0.0.0"
# 监听端口
KUBE_API_PORT="--port=8080"
KUBELET_PORT="--kubelet-port=10250"
# Etcd 服务 http api 地址
KUBE_ETCD_SERVERS="--etcd-servers=http://192.168.1.7:2379,http://192.168.1.8:2379,http://192.168.1.9:2379"
# K8s 之后启动服务的地址范围
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"
# 测试环境暂时去掉 SecurityContextDeny,ServiceAccount
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,ResourceQuota"

启动服务

1
2
3
4
5
6
7
8
9
10
11
sudo systemctl enable kube-apiserver
sudo systemctl enable kube-controller-manager
sudo systemctl enable kube-scheduler

sudo systemctl restart kube-apiserver
sudo systemctl restart kube-controller-manager
sudo systemctl restart kube-scheduler

sudo systemctl status kube-apiserver
sudo systemctl status kube-controller-manager
sudo systemctl status kube-scheduler

配置 Node 节点

配置 /etc/kubernetes/config 文件

1
2
3
4
5
KUBE_LOGTOSTDERR="--logtostderr=true"
KUBE_LOG_LEVEL="--v=0"
KUBE_ALLOW_PRIV="--allow-privileged=false"
# 更改为 api server 地址
KUBE_MASTER="--master=http://192.168.1.7:8080"

配置 /etc/kubernetes/kubelet 文件

1
2
3
4
5
6
7
KUBELET_ADDRESS="--address=127.0.0.1"
# 指定一个全局唯一的名字, 可以使用本机 IP 地址
KUBELET_HOSTNAME="--hostname-override=192.168.1.{$IP}"
# 更改为 api server 地址
KUBELET_API_SERVER="--api-servers=http://192.168.1.7:8080"
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"
KUBELET_ARGS=""

配置 /etc/kubernetes/proxy 文件

1
KUBE_PROXY_ARGS="--bind-address=0.0.0.0"

启动服务

1
2
3
4
5
6
7
8
sudo systemctl enable kube-proxy
sudo systemctl enable kubelet

sudo systemctl restart kube-proxy
sudo systemctl restart kubelet

sudo systemctl status kube-proxy
sudo systemctl status kubelet

配置 flannel 网络

在 etcd 中创建主键, 配置 Docker 容器可用网段

1
etcdctl mk /xxx.com/network/config '{"Network":"172.17.0.0/16","SubnetMin":"172.17.1.0","SubnetMax":"172.17.254.0"}'

在 Node 节点上修改 flannel 配置文件 /etc/sysconfig/flanneld

1
2
3
FLANNEL_ETCD_ENDPOINTS="http://192.168.254.7:2379,http://192.168.254.8:2379,http://192.168.254.9:2379"
FLANNEL_ETCD_PREFIX="/xxx.com/network"
FLANNEL_OPTIONS="--iface=ens33"

启动服务

1
2
3
sudo systemctl enable flanneld
sudo systemctl restart flanneld
sudo systemctl status flanneld

启动服务后, 会生成 /run/flannel/{docker,subnet.env} 文件.

测试环境安全隐患

由于没有配置防火墙, 没有禁用外网端口, 没有 SecurityContextDeny,ServiceAccount 配置等, k8s 的端口完全无权限限制的暴露在公网中, 可能会造成服务器被轻易攻陷.

测试结束后, 我们暂时停止一切 k8s 服务.

master 机器

1
2
3
4
sudo systemctl stop etcd
sudo systemctl stop kube-apiserver
sudo systemctl stop kube-controller-manager
sudo systemctl stop kube-scheduler

node 机器

1
2
3
4
sudo systemctl stop etcd
sudo systemctl stop kube-proxy
sudo systemctl stop kubelet
sudo systemctl stop flanneld
Donate - Support to make this site better.
捐助 - 支持我让我做得更好.