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个<MASTER_IP>:
ETCD_NAME="default"
ETCD_DATA_DIR="/var/lib/etcd/default"
ETCD_LISTEN_CLIENT_URLS="http://<MASTER_IP>:2379"
ETCD_ADVERTISE_CLIENT_URLS="http://<MASTER_IP>: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个<MASTER_IP>:
KUBE_LOGTOSTDERR="--logtostderr=true"
# 日志级别
KUBE_LOG_LEVEL="--v=4"
# Etcd服务地址
KUBE_ETCD_SERVERS="--etcd-servers=http://<MASTER_IP>: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=<MASTER_IP>"
# 允许容器请求特权模式,默认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
    添加如下内容,注意替换<MASTER_IP>:
KUBE_LOGTOSTDERR="--logtostderr=true"
KUBE_LOG_LEVEL="--v=4"
KUBE_MASTER="--master=<MASTER_IP>: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
    添加如下内容,注意替换<MASTER_IP>:
KUBE_LOGTOSTDERR="--logtostderr=true"
KUBE_LOG_LEVEL="--v=4"
KUBE_MASTER="--master=<MASTER_IP>: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
    添加如下内容,注意替换<MASTER_IP>:
apiVersion: v1
kind: Config
clusters:
  - cluster:
      server: http://<MASTER_IP>:8080
    name: local
contexts:
  - context:
      cluster: local
    name: local
current-context: local
  1. 创建kublet配置文件
    vi /opt/kubernetes/cfg/kubelet
    添加如下内容,注意替换两个<NODE_IP>:
# 启用日志标准错误
KUBE_LOGTOSTDERR="--logtostderr=true"
# 日志级别
KUBE_LOG_LEVEL="--v=4"
# Kubelet服务IP地址
NODE_ADDRESS="--address=<NODE_IP>"
# Kubelet服务端口
NODE_PORT="--port=10250"
# 自定义节点名称
NODE_HOSTNAME="--hostname-override=<NODE_IP>"
# 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
    添加如下内容,注意替换<NODE_IP>和<MASTER_IP>:
# 启用日志标准错误
KUBE_LOGTOSTDERR="--logtostderr=true"
# 日志级别
KUBE_LOG_LEVEL="--v=4"
# 自定义节点名称
NODE_HOSTNAME="--hostname-override=<NODE_IP>"
# API服务地址
KUBE_MASTER="--master=http://<MASTER_IP>: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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容