kubernetes(k8s) (一):部署(手动,三节点)

前言

  1. 从二进制包部署 3节点环境(不要害怕,并不难)
  2. 介绍部署时各组件得作用,加强理解。

环境

操作系统:centos 7.5
Kubernetes版本:v1.8.13(1 master,2 node)
Docker版本: 18.03.1-ce

准备工作:

装3台 centos7.5得机器(本实验使用vmware虚拟机, 2G内存)
所有机器执行如下命令:

  1. setenforce 0 (临时关闭selinux)
  2. sed -i /SELINUX=/cSELINUX=diabled /etc/selinux/config (永久关闭selinux)
  3. systemctl stop firewalld (关闭防火墙,手动配置端口规则更好)
  4. systemctl disable firewalld (永久关闭防火墙)

下载k8s server&node 二进制包

server包:

https://dl.k8s.io/v1.8.13/kubernetes-server-linux-amd64.tar.gz

node 包:

https://dl.k8s.io/v1.8.13/kubernetes-node-linux-amd64.tar.gz

包参考地址, 版本v1.8.13

https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.8.md#v1813

一:master 节点搭建

需要构建:

  • etcd: 数据库
  • API Server: 程序入口
  • Scheduler: 调度器
  • Controller Manager: 具体业务处理控制

1. 清空 docker环境

yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine

2. 安装etcd

etcd: 用于持久化存储集群中所有的资源对象,如Node、Service、Pod、RC、Namespace等;API Server提供了操作etcd的封装接口API,这些API基本上都是集群中资源对象的增删改查及监听资源变化的接口。这里记住它是存放信息得数据库即可。

  1. yum install etcd -y
  2. vi /etc/etcd/etcd.conf
    修改,注意替换2个
ETCD_NAME="default"
ETCD_DATA_DIR="/var/lib/etcd/default"
ETCD_LISTEN_CLIENT_URLS="http://:2379"
ETCD_ADVERTISE_CLIENT_URLS="http://:2379"
  1. 启动:
    systemctl enable etcd
    systemctl start etcd

3. 构建k8s server应用目录

注:应用家目录为 /opt/kubernetes
将刚刚下载好得kubernetes-server-linux-amd64.tar.gz 拷进master节点上任意位置。

  1. tar zxvf kubernetes-server-linux-amd64.tar.gz
  2. mkdir -p /opt/kubernetes/{bin,cfg}
  3. mv kubernetes/server/bin/{kube-apiserver,kube-scheduler,kube-controller-manager,kubectl} /opt/kubernetes/bin

4. 启动API Server 组件

API Server: 提供了资源对象的唯一操作入口,其他所有组件都必须通过它提供的API来操作资源数据,通过对相关的资源数据“全量查询”+“变化监听”,这些组件可以很“实时”地完成相关的业务功能。

  1. 创建 apiserver配置文件
    vi /opt/kubernetes/cfg/kube-apiserver
    添加如下内容,注意替换2个
KUBE_LOGTOSTDERR="--logtostderr=true"
# 日志级别
KUBE_LOG_LEVEL="--v=4"
# Etcd服务地址
KUBE_ETCD_SERVERS="--etcd-servers=http://:2379"
# API服务监听地址
KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"
# API服务监听端口
KUBE_API_PORT="--insecure-port=8080"
# 对集群中成员提供API服务地址
KUBE_ADVERTISE_ADDR="--advertise-address="
# 允许容器请求特权模式,默认false
KUBE_ALLOW_PRIV="--allow-privileged=false"
# 集群分配的IP范围
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.10.10.0/24"
  1. 注册为systemd服务
    vi /lib/systemd/system/kube-apiserver.service
    添加如下内容:
[Unit]
Description=Kubernetes API Server
Documentation=https://github.com/kubernetes/kubernetes
[Service]
EnvironmentFile=-/opt/kubernetes/cfg/kube-apiserver
#ExecStart=/opt/kubernetes/bin/kube-apiserver ${KUBE_APISERVER_OPTS}
ExecStart=/opt/kubernetes/bin/kube-apiserver \
${KUBE_LOGTOSTDERR} \
${KUBE_LOG_LEVEL} \
${KUBE_ETCD_SERVERS} \
${KUBE_API_ADDRESS} \
${KUBE_API_PORT} \
${KUBE_ADVERTISE_ADDR} \
${KUBE_ALLOW_PRIV} \
${KUBE_SERVICE_ADDRESSES}
Restart=on-failure
[Install]
WantedBy=multi-user.target
  1. 启动API Server
    systemctl daemon-reload
    systemctl enable kube-apiserver
    systemctl restart kube-apiserver

5. 启动 Scheduler 组件

scheduler:集群中的调度器,负责Pod在集群节点中的调度分配

  1. 创建scheduler配置文件
    vi /opt/kubernetes/cfg/kube-scheduler
    添加如下内容,注意替换
KUBE_LOGTOSTDERR="--logtostderr=true"
KUBE_LOG_LEVEL="--v=4"
KUBE_MASTER="--master=:8080"
KUBE_LEADER_ELECT="--leader-elect"
  1. 注册为systemd服务
    vi /lib/systemd/system/kube-scheduler.service
    添加如下内容:
[Unit]
Description=Kubernetes Scheduler
Documentation=https://github.com/kubernetes/kubernetes
[Service]
EnvironmentFile=-/opt/kubernetes/cfg/kube-scheduler
ExecStart=/opt/kubernetes/bin/kube-scheduler \
${KUBE_LOGTOSTDERR} \
${KUBE_LOG_LEVEL} \
${KUBE_MASTER} \
${KUBE_LEADER_ELECT}
Restart=on-failure
[Install]
WantedBy=multi-user.target
  1. 启动Scheduler
    systemctl daemon-reload
    systemctl enable kube-scheduler
    systemctl restart kube-scheduler

6. 启动Controller Manager组件

controller manager:集群内部的管理控制中心,其主要目的是实现Kubernetes集群的故障检测和恢复的自动化工作,比如根据RC的定义完成Pod的复制或移除,以确保Pod实例数符合RC副本的定义;根据Service与Pod的管理关系,完成服务的Endpoints对象的创建和更新;其他诸如Node的发现、管理和状态监控、死亡容器所占磁盘空间及本地缓存的镜像文件的清理等工作也是由Controller Manager完成的。

  1. 创建controller manager 配置文件
    vi /opt/kubernetes/cfg/kube-controller-manager
    添加如下内容,注意替换
KUBE_LOGTOSTDERR="--logtostderr=true"
KUBE_LOG_LEVEL="--v=4"
KUBE_MASTER="--master=:8080"
  1. 注册为systemd服务
    vi /lib/systemd/system/kube-controller-manager.service
    添加如下内容:
[Unit]
Description=Kubernetes Controller Manager
Documentation=https://github.com/kubernetes/kubernetes
[Service]
EnvironmentFile=-/opt/kubernetes/cfg/kube-controller-manager
ExecStart=/opt/kubernetes/bin/kube-controller-manager \
${KUBE_LOGTOSTDERR} \
${KUBE_LOG_LEVEL} \
${KUBE_MASTER} \
${KUBE_LEADER_ELECT}
Restart=on-failure
[Install]
WantedBy=multi-user.target
  1. 启动Controller Manager
    systemctl daemon-reload
    systemctl enable kube-controller-manager
    systemctl restart kube-controller-manager

7. 查看服务启动情况

ps aux | grep kube
可以看到3个组件得启动情况如下:

image.png

二:node节点搭建

需要构建:

  • docker
  • kubelet: 具体业务处理者
  • kube-proxy: 负载均衡器

1. docker环境

  1. 清空旧环境:
    yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine
  2. 安装docker:
    yum install -y yum-utils device-mapper-persistent-data lvm2
    yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
    yum install docker-ce
    systemctl start docker
    systemctl enable docker

2. 构建k8s node节点应用目录

注:应用家目录为 /opt/kubernetes
将刚刚下载好得kubernetes-node-linux-amd64.tar.gz 拷进node节点上任意位置。

  1. tar zxvf kubernetes-node-linux-amd64.tar.gz
  2. mkdir -p /opt/kubernetes/{bin,cfg}
  3. mv kubernetes/node/bin/{kubelet,kube-proxy} /opt/kubernetes/bin/

3. 启动Kubelet组件

kubelet: 负责本Node节点上的Pod的创建、修改、监控、删除等全生命周期管理,同时Kubelet定时“上报”本Node的状态信息到API Server里。

  1. 创建kubeconfig配置文件,用于连接master节点api server
    vi /opt/kubernetes/cfg/kubelet.kubeconfig
    添加如下内容,注意替换
apiVersion: v1
kind: Config
clusters:
  - cluster:
      server: http://:8080
    name: local
contexts:
  - context:
      cluster: local
    name: local
current-context: local
  1. 创建kublet配置文件
    vi /opt/kubernetes/cfg/kubelet
    添加如下内容,注意替换两个
# 启用日志标准错误
KUBE_LOGTOSTDERR="--logtostderr=true"
# 日志级别
KUBE_LOG_LEVEL="--v=4"
# Kubelet服务IP地址
NODE_ADDRESS="--address="
# Kubelet服务端口
NODE_PORT="--port=10250"
# 自定义节点名称
NODE_HOSTNAME="--hostname-override="
# 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"
  1. 注册systemd服务
    vi /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
  1. 启动Kubelet
    启动之前要先关闭swap
    swapoff -a
    systemctl daemon-reload
    systemctl enable kubelet
    systemctl restart kubelet

4. 启动kube-proxy组件

kube-proxy: 实现了Service的代理与软件模式的负载均衡器。创建了service得pods,此组件决定由哪个pod进行服务。

  1. 创建kube-proxy配置文件
    vi /opt/kubernetes/cfg/kube-proxy
    添加如下内容,注意替换
# 启用日志标准错误
KUBE_LOGTOSTDERR="--logtostderr=true"
# 日志级别
KUBE_LOG_LEVEL="--v=4"
# 自定义节点名称
NODE_HOSTNAME="--hostname-override="
# API服务地址
KUBE_MASTER="--master=http://:8080"
  1. 注册systemd服务
    vi /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
  1. 启动kube-proxy
    systemctl daemon-reload
    systemctl enable kube-proxy
    systemctl restart kube-proxy

5. 查看服务启动情况

ps aux |grep kube
可以看到两个组件得启动详情如下:

image.png

三:查看集群状态

在master节点执行如下命令:

  1. 将可执行文件添加到系统变量,方便使用
    echo "export PATH=$PATH:/opt/kubernetes/bin" >> /etc/profile
    source /etc/profile
  2. 查看集群节点
    kubectl get node
    显示如下:
    image.png

四:增加新节点到集群

至此,已经完成了双节点搭建。第三个node节点得搭建参考前面node节点搭建。
只需修改kubelet配置文件中的--address和--hostname-override选项为本机IP。


image.png

五: 进阶

以上3节点部署只是非常基础得版本,还有许多待改进得地方:

  • etcd&apiserver集群模式
  • Flannel网络部署:当我们启动 Docker 后会有一个用于和容器进行交互的 IP 地址,如果不去管理的话可能这个 IP 地址在各个机器上是一样的,并且仅限于在本机上进行通信,无法访问到其他机器上的 Docker 容器。Flannel 的目的就是为集群中的所有节点重新规划 IP 地址的使用规则,从而使得不同节点上的容器能够获得同属一个内网且不重复的 IP 地址,并让属于不同节点上的容器能够直接通过内网 IP 通信。
下一章将介绍初步使用k8s

https://www.jianshu.com/p/bc015e562b16

注意事项:

  1. master节点上得etcd和apiserver启动顺序有要求:先启动etcd再启动apiserver

你可能感兴趣的:(kubernetes(k8s) (一):部署(手动,三节点))