使用二进制包部署 K8S 环境

注意

k8s 从 1.13 版本不再支持 etcd2, 仅支持 etcd3, 这也是 k8s 默认就支持的。

参见 kubernetes github

k8s 相关版本存在安全漏洞, 请升级或者打补丁你的 k8s

预备知识

你必须了解新的 Linux systemd 启动方式以及旧的 init.d 的启动方式,

以免在配置文件失效时手足无措。 阮一峰老师在他的博客中对 systemd

已经做了很详细的介绍了, 请自行参考以下博客。

Systemd 入门教程:命令篇

Systemd 入门教程:实战篇

K8S 环境

主要采用两台阿里云服务器进行环境的部署, 一台作为 master, 另一台作为 node。

详细如下。

角色 IP 组件
master 47.104.230.228 etcd、kube-apiserver、kube-controller-manager、kube-scheduler
node01 47.97.160.187 kubelet、kube-proxy、docker

我这里采用的是 K8S 1.8 版本, 算比较旧。

Master 节点配置

Master 和 Node 节点的配置请先参考这篇教程Kubernetes(K8S) 集群管理 Docker 容器(部署篇)本文只是针对这篇博客进行补充说明。提示: 这篇博客的复制黏贴有空格的问题, 我已经将配置托管到 Github 上, Github 地址

如果是 etcd2, 必须多配置一个参数, --storage-backend=etcd2, 如下:

/opt/kubernetes/bin/kube-apiserver --logtostderr=true \

--v=4 \

--etcd-servers=http://47.104.230.228:2379 \

--insecure-bind-address=47.97.160.187 \

--insecure-port=8080 \

--advertise-address=47.104.230.228 \

--allow-privileged=false \

--service-cluster-ip-range=10.10.10.0/24 \

--storage-backend=etcd2 

题外话:

不要暴露 0.0.0.0, 使用 RBAC。

另外可采用 Rancher 方式部署

node 节点配置

/opt/kubernetes/cfg/kubelet.kubeconfig

apiVersion: v1
kind: Config
clusters:
- cluster:
    server: http://47.104.230.228:8080
  name: local
contexts:
- context:
    cluster: local
  name: local
current-context: local

/opt/kubernetes/cfg/kubelet

# 启用日志标准错误
KUBE_LOGTOSTDERR="--logtostderr=true"
# 日志级别
KUBE_LOG_LEVEL="--v=4"
# Kubelet服务IP地址
NODE_ADDRESS="--address=172.16.252.50"
# Kubelet服务端口
NODE_PORT="--port=10250"
# 自定义节点名称
NODE_HOSTNAME="--hostname-override=47.97.160.187"
# kubeconfig路径,指定连接API服务器
KUBELET_KUBECONFIG="--kubeconfig=/opt/kubernetes/cfg/kubelet.kubeconfig"
# 允许容器请求特权模式,默认false
KUBE_ALLOW_PRIV="--allow-privileged=false"
# DNS信息
KUBELET_DNS_IP="--cluster-dns=10.10.10.2"
KUBELET_DNS_DOMAIN="--cluster-domain=cluster.local"
# 禁用使用Swap
KUBELET_SWAP="--fail-swap-on=false"

注意: --address 必须使用阿里云服务器的私有 ip, 而不是公网 ip。

阿里云内网 ip: 172.16.252.50

阿里云外网 ip:47.97.160.187

使用外网 ip 会报错:

I1213 14:14:19.900000   10842 server.go:718] Started kubelet v1.8.3
E1213 14:14:19.900514   10842 kubelet.go:1234] Image garbage
collection failed once. Stats initialization may not have completed 

yet: failed to get imageFs info: unable to find data for container /
I1213 14:14:19.900947   10842 mount_linux.go:600] Directory /var/lib/kubelet is already on a shared mount
I1213 14:14:19.901023   10842 kubelet_node_status.go:280] Setting node annotation to enable volume controller attach/detach
I1213 14:14:19.901409   10842 server.go:128] Starting to listen on 47.97.160.187:10250
I1213 14:14:19.902313   10842 server.go:296] Adding debug handlers to kubelet server.
F1213 14:14:19.903735   10842 server.go:140] listen tcp 47.97.160.187:10250: bind: cannot assign requested address

/lib/systemd/system/kubelet.service

[Unit]
Description=Kubernetes Kubelet
After=docker.service
Requires=docker.service

[Service]
EnvironmentFile=-/opt/kubernetes/cfg/kubelet
ExecStart=/opt/kubernetes/bin/kubelet \
${KUBE_LOGTOSTDERR} \
${KUBE_LOG_LEVEL} \
${NODE_ADDRESS} \
${NODE_PORT} \
${NODE_HOSTNAME} \
${KUBELET_KUBECONFIG} \
${KUBE_ALLOW_PRIV} \
${KUBELET_DNS_IP} \
${KUBELET_DNS_DOMAIN} \
${KUBELET_SWAP}
Restart=on-failure
KillMode=process

[Install]
WantedBy=multi-user.target

kubelet.service 相当于执行以下脚本:

/opt/kubernetes/bin/kubelet --logtostderr=true \

--v=4 \

--address=172.16.252.50 \

--port=10250 \

--hostname-override=47.97.160.187 \

--kubeconfig=/opt/kubernetes/cfg/kubelet.kubeconfig \

--allow-privileged=false \

--cluster-dns=10.10.10.2 \

--cluster-domain=cluster.local \

--fail-swap-on=false

/opt/kubernetes/cfg/kube-proxy

# 启用日志标准错误

KUBE_LOGTOSTDERR="--logtostderr=true"

# 日志级别

KUBE_LOG_LEVEL="--v=4"

# 自定义节点名称

NODE_HOSTNAME="--hostname-override=47.97.160.187"

# API服务地址

KUBE_MASTER="--master=http://47.104.230.228:8080"

/lib/systemd/system/kube-proxy.service

[Unit]
Description=Kubernetes Proxy
After=network.target
[Service]
EnvironmentFile=-/opt/kubernetes/cfg/kube-proxy
ExecStart=/opt/kubernetes/bin/kube-proxy \
${KUBE_LOGTOSTDERR} \
${KUBE_LOG_LEVEL} \
${NODE_HOSTNAME} \
${KUBE_MASTER}
Restart=on-failure
[Install]
WantedBy=multi-user.target

参考博客

Kubernetes(K8S) 集群管理 Docker 容器(部署篇)

K8S 安全漏洞

来源于公众号:Kubernetes 惊现首个重大安全漏洞,可随意提升 root 权限

来源于 InfoQ:Kubernetes 惊现首个重大安全漏洞,可随意提升 root 权限

发表评论

评论内容
 

评论列表, 共 0 条评论