我在3台VM上装了一套版本1.12.3的k8s集群,并输出整理了一个安装文档以及安装过程中的配置文件。
节点IP地址 角色 安装组件名称
192.168.64.128 Master(管理节点) docker、etcd、kube-apiserver、kube-scheduer、kube-controller-manager、flanneld(可选)
192.168.64.129 Node1(计算节点) docker、kubelet、kube-proxy
192.168.64.130 Node2(计算节点) docker、kubelet、kube-proxy
1 准备虚拟机:略
2 安装docker:版本18.09.0安装略
2.1下载etcd
K8S需要etcd作为数据库。以最新版本v3.3.10为例,如下:
下载地址:
https://github.com/etcd-io/etcd/releases/download/v3.3.10/etcd-v3.3.10-linux-amd64.tar.gz
2.2 下载 kubernetes (简称K8s)
下载地址:
https://dl.k8s.io/v1.12.3/kubernetes-server-linux-amd64.tar.gz
该文件已经包含了K8s所需要的全部组件,无需单独下载 Client等组件
3 安装规划
本文以三个节点为例(步骤一申请)。具体节点安装组件如下
其中etcd为K8s数据库,其他组件为k8s组件。
节点IP地址 角色 安装组件名称
192.168.64.128 Master(管理节点) docker、etcd、kube-apiserver、kube-scheduler、kube-controller-manager、flanneld(可选)
192.168.64.129 Node1(计算节点) docker、kubelet、kube-proxy
192.168.64.130 Node2(计算节点) docker、kubelet、kube-proxy
3.1系统设置(所有节点)
关闭、禁用防火墙(让所有机器之间都可以通过任意端口建立连接)
$ ufw disable
#查看状态
$ ufw status
关闭交换内存:
$ swapoff -a
3.2 设置系统参数 - 允许路由转发,不对bridge的数据进行处理
#写入配置文件
$ cat <<EOF > /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
#生效配置文件
$ sysctl -p /etc/sysctl.d/k8s.conf
3.3 配置host文件
#配置host,使每个Node都可以通过名字解析到ip地址
$ vi /etc/hosts#加入如下片段(ip地址和servername替换成自己的)
192.168.64.128 master
192.168.64.129 node1
192.168.64.130 node2
4 . Master节点部署
注意: 以二进制文件部署
1.复制对应的二进制文件到/usr/local/bin目录下
2. 创建 systemd service启动服务文件
3. 将该应用加入到开机自启
4.1安装etcd (只部署单节点,可靠性至少部署三节点)
4.11拷贝etcd二进制文件
将下载的etcd上传到 master节点(192.168.64.128),解压后将etcd、 etcdctl二进
制文件复制到 /usr/local/bin目录
4.12设置etcd.service服务文件
在 /etc/systemd/system/目录里创建 etcd.service,其内容如下:
[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target
Documentation=https://github.com/coreos
[Service]
Type=notify
WorkingDirectory=/var/lib/etcd/
ExecStart=/usr/local/bin/etcd \
--name=192.168.64.128 \
--listen-client-urls=http://192.168.64.128:2379,http://127.0.0.1:2379 \
--advertise-client-urls=http://192.168.64.128:2379 \
--data-dir=/var/lib/etcd
Restart=on-failure
RestartSec=5
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
其中 WorkingDirectory为etcd数据库目录,需要在etcd之前创建
其中192.168.64.128 修改为本机对应的ip
mkdir –p /var/lib/etcd
4.1.4 配置开机启动
systemctl daemon-reload
systemctl enable etcd.service
systemctl start etcd.service
4.1.5检验etcd是否安装成功
etcdctl cluster-health
查看etcd服务状态信息
systemctl status etcd
4.2安装k8s组件
1、下载的k8s上传到 master节点(192.168.64.128)
2、将 kube-apiserver、 kube-controller-manger、kube-scheduler三个可执行文件复制到 /usr/local/bin
4.2.1.1安装 kube-apiserver
4.2.1.1.1创建服务文件 /usr/lib/systemd/system/kube-apiserver.service
[Unit]
Description=Kubernetes API Server
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=network.target
[Service]
ExecStart=/usr/local/bin/kube-apiserver \
--admission-control=NamespaceLifecycle,LimitRanger,DefaultStorageClass,ResourceQuota,NodeRestriction \
--insecure-bind-address=0.0.0.0 \
--kubelet-https=false \
--service-cluster-ip-range=10.68.0.0/16 \
--service-node-port-range=20000-40000 \
--etcd-servers=http://192.168.64.128:2379 \
--enable-swagger-ui=true \
--allow-privileged=true \
--audit-log-maxage=30 \
--audit-log-maxbackup=3 \
--audit-log-maxsize=100 \
--audit-log-path=/var/lib/audit.log \
--event-ttl=1h \
--v=2
Restart=on-failure
RestartSec=5
Type=notify
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
其中192.168.64.128改成自己ip
# 启用日志标准错误
"--logtostderr=true"
# 日志级别
"--v=4"
# Etcd服务地址
"--etcd-servers=http://192.168.64.128:2379"
# API服务监听地址
"--insecure-bind-address=0.0.0.0"
#API服务监听端口
"--insecure-port=8080"
"--advertise-address=192.168.64.128"
# 允许容器请求特权模式, 默认 false
"--allow-privileged=false"
#集群分配的IP范围
"--service-cluster-ip-range=172.0.0.0/24"
4.2.1.2安装 kube-controller-manger
4.2.1.2.1创建 systemd服务文件 /usr/lib/systemd/system/kube-controller-manager.service
[Unit]
Description=Kubernetes Controller Manager
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
[Service]
ExecStart=/usr/local/bin/kube-controller-manager \
--address=127.0.0.1 \
--master=http://127.0.0.1:8080 \
--allocate-node-cidrs=true \
--service-cluster-ip-range=10.68.0.0/16 \
--cluster-cidr=172.20.0.0/16 \
--cluster-name=kubernetes \
--leader-elect=true \
--cluster-signing-cert-file= \
--cluster-signing-key-file= \
--v=2
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
4.2.1.3安装 kube-scheduler
4.2.1.3.1创建sysemd服务文件 /usr/lib/systemd/system/kube-scheduler.service
[Unit]
Description=Kubernetes Scheduler
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
[Service]
ExecStart=/usr/local/bin/kube-scheduler \
--address=127.0.0.1 \
--master=http://127.0.0.1:8080 \
--logtostderr=true \
--log-dir=/home/k8s-t/log/kubernetes \
--leader-elect=true \
--v=2
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
mkdir /home/k8s-t/log/kubernetes
4.2.1.4启动 mater节点上的k8s组件
完成以上配置后,按顺序启动这些服务
systemctl daemon-reload
systemctl enable kube-apiserver.service
systemctl start kube-apiserver.service
systemctl enable kube-controller-manager.service
systemctl start kube-controller-manager.service
systemctl enable kube-scheduler.service
systemctl start kube-scheduler.service
检查每个服务的健康状态:
systemctl status kube-apiserver.service
systemctl status kube-controller-manager.service
systemctl status kube-scheduler.service
如果有服务出现异常,可执行 journalctl -xe -u kube-scheduler查看一个指定的服务的事件信息日志。
或者journalctl -xe
(可选安装flanneld,用于构建网络规则)
1.下载地址
wget https://github.com/coreos/flannel/releases/download/v0.10.0/flannel-v0.10.0-linux-amd64.tar.gztar -xzvf flannel-v0.10.0-linux-amd64.tar.gz
cp {flanneld,mk-docker-opts.sh} /usr/local/bin
2.向 etcd 写入网段信息
注意: 在一台上设置即可,会同步过去!!!
下面2条命令在etcd集群中任意一台执行一次即可,也是是创建一个flannel网段供docker分配使用
etcdctl mkdir /atomic.io/network
etcdctl mk /atomic.io/network/config "{ \"Network\": \"172.17.0.0/16\", \"SubnetLen\": 24, \"Backend\": { \"Type\": \"vxlan\" } }"
3.只要在master节点设置
vim /usr/lib/systemd/system/flanneld.service
[Unit]
Description=Flanneld overlay address etcd agent
After=network.target
After=network-online.target
Wants=network-online.target
After=etcd.service
Before=docker.service
[Service]
Type=notify
EnvironmentFile=/usr/local/bin/flanneld
ExecStart=/usr/local/bin/flanneld -etcd-endpoints=http://172.16.23.128:2379 -etcd-prefix=/atomic.io/network --iface=ens33
ExecStartPost=/usr/local/bin/mk-docker-opts.sh -k DOCKER_NETWORK_OPTIONS -d /run/flannel/docker
Restart=on-failure
[Install]
WantedBy=multi-user.target
RequiredBy=docker.service
4、启动flannel并且设置开机自启动
systemctl daemon-reload
systemctl enable flanneld
systemctl start flanneld
systemctl daemon-reload
systemctl restart docker
4.3小结
完成上述步骤,, Master节点组件就全部启动了,需要注意的是服务启动顺序有依赖,先启
动etcd,再启动 pserver,其他组件无顺序要求。
5 Node节点部署
在Node节点上,以同样的方式把从压缩包中解压出的二进制文件 kubelet、kube-proxy放
到对应节点的/usr/local/bin目录中。
5.1安装 kubelet
5.1.1创建配置文件 kubeconfig
kubeconfig文件用于 kubelet连接 master apiserver的配置信息。
# vi /etc/kubernetes/kubelet.kubeconfig
apiVersion: v1
clusters:
- cluster:
insecure-skip-tls-verify: true
server: http://192.168.64.128:8080
name: kubernetes
contexts:
- context:
cluster: kubernetes
user: ""
name: system:node:kube-master
current-context: system:node:kube-master
kind: Config
preferences: {}
users: []
说明:#server是api-server地址
5.1.2 创建 systemd服务文件 kubelet.service
# vi /lib/systemd/system/kubelet.service
[Unit]
Description=Kubernetes Kubelet
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=docker.service
Requires=docker.service
[Service]
WorkingDirectory=/var/lib/kubelet
ExecStart=/usr/local/bin/kubelet \
--address=192.168.64.129 \
--hostname-override=192.168.64.129 \
--pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/imooc/pause-amd64:3.0 \
--kubeconfig=/etc/kubernetes/kubelet.kubeconfig \
--cluster-dns=10.68.0.2 \
--cluster-domain=cluster.local. \
--allow-privileged=true \
--fail-swap-on=false \
--logtostderr=true \
--v=2
#kubelet cAdvisor 默认在所有接口监听 4194 端口的请求, 以下iptables限制内网访问
#ExecStartPost=/sbin/iptables -A INPUT -s 10.0.0.0/8 -p tcp --dport 4194 -j ACCEPT
#ExecStartPost=/sbin/iptables -A INPUT -s 172.16.0.0/12 -p tcp --dport 4194 -j ACCEPT
#ExecStartPost=/sbin/iptables -A INPUT -s 192.168.0.0/16 -p tcp --dport 4194 -j ACCEPT
#ExecStartPost=/sbin/iptables -A INPUT -p tcp --dport 4194 -j DROP
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
注意:192.168.64.129改成自己ip
mkdir /var/lib/kubelet
#启用日志标住错误
"--logtostderr=true"
#日志级别
"--v=4"
# Kubelet服务IP地址,本节点的IP
"--address=192.168.64.129"
# Kubelet服务端囗
"--port=10250"
#自定义节点名称,本节点的IP
"--hostname-override=192.168.64.129"
# kubeconfig路径,指定连接API服务器
"--kubeconfig=/etc/kubernetes/kubelet.kubeconfig”
# 允许容器请求特权模式, 默认 false
"--allow-privileged=true"
# DNS信息
"--cluster-dns=10.68.0.2"
"--cluster-domain=cluster.local."
#禁用使用Swap
"--fail-swap-on=false"
5.2安装 proxy
5.2.1创建 systemd服务文件 kube-proxy.service
# vim/lib/systemd/system/kube-proxy.service
[Unit]
Description=Kubernetes Kube-Proxy Server
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=network.target
[Service]
WorkingDirectory=/var/lib/kube-proxy
ExecStart=/usr/local/bin/kube-proxy \
--bind-address=192.168.64.129 \
--hostname-override=192.168.64.129 \
--kubeconfig=/etc/kubernetes/kube-proxy.kubeconfig \
--logtostderr=true \
--v=2
Restart=on-failure
RestartSec=5
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
Vim /lib/systemd/system/kube-proxy.kubeconfig
说明:
# --bind-address监听地址
mkdir /var/lib/kube-proxy
5.2.2 创建 systemd服务文件 kube-proxy.kubeconfig
# vim /etc/kubernetes/kube-proxy.kubeconfig
apiVersion: v1
clusters:
- cluster:
server: http://192.168.64.128:8080
name: kubernetes
contexts:
- context:
cluster: kubernetes
name: default
current-context: default
kind: Config
preferences: {}
users: []
说明:
#server是api-server地址
5.3启动Node节点上的k8s组件
完成以上配置后,启动这些服务
systemctl daemon-reload
systemctl enable kubelet
systemctl start kubelet
systemctl enable kube-proxy
systemctl start kube-proxy
检查每个服务的健康状态:
systemctl status kubelet
systemctl status kube-proxy
如果有服务出现异常,可执行 journalctl -xe -u kubelet查看一个指定的服务的事件信息日志。
或journalctl -xe
5.4小结
其他节点加入集群与node01方式相同,但需修改 kubelet的 --address和 –hostname
--override选项为本机IP。
查看Node节点组件进程状态:
6验证集群是否部署成功
1、将k8s解压得到的 kubectl拷贝到/usr/local/bin目录下。
2、查看集群节点状态:
两个节点都加入到了 kubernetes集群,就此部署完成。
查询 service
查询 componentstatuses