Kubernetes离线部署流程(附资源)

Kubernetes介绍

Kubernetes是Google在2014年6月开源的一个容器集群管理系统,使用Go语言开发,Kubernetes也叫K8S。K8S是Google内部一个叫Borg的容器集群管理系统衍生出来的,Borg已经在Google大规模生产运行十年之久。K8S主要用于自动化部署、扩展和管理容器应用,提供了资源调度、部署管理、服务发现、扩容缩容、监控等一整套功能。2015年7月,Kubernetes v1.0正式发布,截止到2018年4月25日最新稳定版本是v1.10。Kubernetes目标是让部署容器化应用简单高效。
官方网站:www.kubernetes.io

Kubernetes 主要功能

  • 数据卷
    Pod中容器之间共享数据,可以使用数据卷。
  • 应用程序健康检查
    容器内服务可能进程堵塞无法处理请求,可以设置监控检查策略保证应用健壮性。
  • 复制应用程序实例
    控制器维护着Pod副本数量,保证一个Pod或一组同类的Pod数量始终可用。
  • 弹性伸缩
    根据设定的指标(CPU利用率)自动缩放Pod副本数。
  • 服务发现
    使用环境变量或DNS服务插件保证容器中程序发现Pod入口访问地址。
  • 负载均衡
    一组Pod副本分配一个私有的集群IP地址,负载均衡转发请求到后端容器。在集群内部其他Pod可通过这个ClusterIP访问应用。
  • 滚动更新
    更新服务不中断,一次更新一个Pod,而不是同时删除整个服务。
  • 服务编排
    通过文件描述部署服务,使得应用程序部署变得更高效。
  • 资源监控
    Node节点组件集成cAdvisor资源收集工具,可通过Heapster汇总整个集群节点资源数据,然后存储到InfluxDB时序数据库,再由Grafana展示。
  • 提供认证和授权
    支持角色访问控制(RBAC)认证授权等策略。

基本对象概念

  • Pod
    Pod是最小部署单元,一个Pod有一个或多个容器组成,Pod中容器共享存储和网络,在同一台Docker主机上运行。
  • Service
    Service一个应用服务抽象,定义了Pod逻辑集合和访问这个Pod集合的策略。
    Service代理Pod集合对外表现是为一个访问入口,分配一个集群IP地址,来自这个IP的请求将负载均衡转发后端Pod中的容器。
    Service通过Lable Selector选择一组Pod提供服务。
  • Volume
    数据卷,共享Pod中容器使用的数据。
  • Namespace
    命名空间将对象逻辑上分配到不同Namespace,可以是不同的项目、用户等区分管理,并设定控制策略,从而实现多租户。命名空间也称为虚拟集群。
  • Lable
    标签用于区分对象(比如Pod、Service),键/值对存在;每个对象可以有多个标签,通过标签关联对象。
    基于基本对象更高层次抽象:
  • ReplicaSet:
    下一代Replication Controller。确保任何给定时间指定的Pod副本数量,并提供声明式更新等功能。RC与RS唯一区别就是lable selector支持不同,RS支持新的基于集合的标签,RC仅支持基于等式的标签。
  • Deployment
    Deployment是一个更高层次的API对象,它管理ReplicaSets和Pod,并提供声明式更新等功能。官方建议使用Deployment管理ReplicaSets,而不是直接使用ReplicaSets,这就意味着可能永远不需要直接操作ReplicaSet对象。
  • StatefulSet
    StatefulSet适合持久性的应用程序,有唯一的网络标识符(IP),持久存储,有序的部署、扩展、删除和滚动更新。
  • DaemonSet
    DaemonSet确保所有(或一些)节点运行同一个Pod。当节点加入Kubernetes集群中,Pod会被调度到该节点上运行,当节点从集群中移除时,DaemonSet的Pod会被删除。删除DaemonSet会清理它所有创建的Pod。
  • Job
    一次性任务,运行完成后Pod销毁,不再重新启动新容器。还可以任务定时运行。

系统架构及组件功能

image.png

Master组件:

- kube-apiserver

Kubernetes API,集群的统一入口,各组件协调者,以HTTP API提供接口服务,所有对象资源的增删改查和监听操作都交给APIServer处理后再提交给Etcd存储。

- kube-controller-manager

处理集群中常规后台任务,一个资源对应一个控制器,而ControllerManager就是负责管理这些控制器的。

- kube-scheduler

根据调度算法为新创建的Pod选择一个Node节点。

Node组件:

  • kubelet

kubelet是Master在Node节点上的Agent,管理本机运行容器的生命周期,比如创建容器、Pod挂载数据卷、下载secret、获取容器和节点状态等工作。kubelet将每个Pod转换成一组容器。

  • kube-proxy

在Node节点上实现Pod网络代理,维护网络规则和四层负载均衡工作。

  • docker或rocket/rkt

运行容器。

第三方服务:

  • etcd

分布式键值存储系统。用于保持集群状态,比如Pod、Service等对象信息。

集群部署-环境规划

软件 版本
Linux操作系统 Centos 7.3
Kubernetes 1.9
Docker 18.03.1-ce
Etcd 3.0
角色 IP 组件
Master 172.16.0.42 kube-apiserver kube-controller-manager kube-scheduler etcd
Node1 172.16.0.43 kubelet kube-proxy docker flannel etcd
Node2 172.16.0.42 kubelet kube-proxy docker flannel etcd
镜像仓库 172.16.0.44 docker

集群部署-安装Docker

将依赖包里面install-docker.sh docker-18.03.1-ce.tgz上传至节点。
在两个节点node01和node02以及镜像仓库上安装docker并关闭防火墙。

# sudo sh install-docker.sh docker-18.03.1-ce.tgz

# sudo systemctl disable firewalld

# sudo systemctl stop firewalld 

安装完成后,在etc目录下新建docker文件夹,在docker文件夹下新建daemon.json文件,并写入国内公有镜像仓库地址以及私有镜像仓库地址。

#sudo vi /etc/docker/daemon.json
{
"registry-mirrors": [ "https://registry.docker-cn.com"],
"insecure-registries":["172.16.0.44:5000"]
}

启动docker并设置docker开机启动

# sudo systemctl start docker
# sudo systemctl enable docker

查看是否安装成功

#sudo docker info
image.png

集群部署 – 自签TLS证书

组件 使用的证书
etcd ca.pem,server.pem,server-key.pem
flannel ca.pem,server.pem,server-key.pem
kube-apiserver ca.pem,server.pem,server-key.pem
kubelet ca.pem,ca-key.pem
kube-proxy ca.pem,kube-proxy.pem,kube-proxy-key.pem
kubectl ca.pem,admin.pem,admin-key.pem

在master节点下/home目录下新建ssl文件夹用来存放证书。

# cd home
# sudo mkdir ssl

将依赖包里面的cfssl_linux-amd64,cfssljson_linux-amd64, cfssl-certinfo_linux-amd64上传至master节点。

添加可执行权限

# sudo chmod +x cfssl_linux-amd64 cfssljson_linux-amd64 cfssl-certinfo_linux-amd64

移动文件

# sudo mv cfssl_linux-amd64 /usr/local/bin/cfssl 
# sudo mv cfssljson_linux-amd64 /usr/local/bin/cfssljson 
# sudo mv cfssl-certinfo_linux-amd64 /usr/bin/cfssl-certinfo

移动后可以输入命令查看help

# sudo cfssl --help
image.png

将依赖包里面的certificate.sh上传到master节点根目录的ssl文件夹下。
修改权限

# sudo chmod +x certificate.sh

修改certificate.sh文件下host地址为你的三个节点的IP地址

image.png

运行脚本文件

# sudo ./certificate.sh

ssl目录下会生成17个新文件。


image.png

删除除了证书以外的其他文件

# sudo ls | grep -v pem | xargs -i rm {}
image.png

集群部署 – 部署Etcd集群

将etcd-v3.2.12-linux-amd64.tar.gz 上传至master节点
解压

# sudo tar zxvf etcd-v3.2.12-linux-amd64.tar.gz

创建目录

# sudo mkdir /opt/kubernetes

之后所有组件都放入这个文件夹,方便统一管理维护。
再创建三个目录

# sudo mkdir /opt/kubernetes/{bin,cfg,ssl}

在刚才解压的文件夹里面找到etcd和etcdctl并将两个文件移动到/opt/kubernetes/bin下

# sudo mv etcd-v3.2.12-linux-amd64/etcd /opt/kubernetes/bin/
# sudo mv etcd-v3.2.12-linux-amd64/etcdctl /opt/kubernetes/bin/

创建配置文件

# sudo vi /opt/kubernetes/cfg/etcd

写入以下内容

#[Member]
ETCD_NAME="etcd01"
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://172.16.0.41:2380"
ETCD_LISTEN_CLIENT_URLS="https://172.16.0.41:2379"

#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://172.16.0.41:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://172.16.0.41:2379"
ETCD_INITIAL_CLUSTER="etcd01=https://172.16.0.41:2380,etcd02=https://172.16.0.42:2380,etcd03=https://172.16.0.43:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"

保存退出

创建配置文件,通过systemd管理配置文件

# sudo vi /usr/lib/systemd/system/etcd.service

增加下面内容

[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target

[Service]
Type=notify
EnvironmentFile=-/opt/kubernetes/cfg/etcd
ExecStart=/opt/kubernetes/bin/etcd \
--name=${ETCD_NAME} \
--data-dir=${ETCD_DATA_DIR} \
--listen-peer-urls=${ETCD_LISTEN_PEER_URLS} \
--listen-client-urls=${ETCD_LISTEN_CLIENT_URLS},http://127.0.0.1:2379 \
--advertise-client-urls=${ETCD_ADVERTISE_CLIENT_URLS} \
--initial-advertise-peer-urls=${ETCD_INITIAL_ADVERTISE_PEER_URLS} \
--initial-cluster=${ETCD_INITIAL_CLUSTER} \
--initial-cluster-token=${ETCD_INITIAL_CLUSTER} \
--initial-cluster-state=new \
--cert-file=/opt/kubernetes/ssl/server.pem \
--key-file=/opt/kubernetes/ssl/server-key.pem \
--peer-cert-file=/opt/kubernetes/ssl/server.pem \
--peer-key-file=/opt/kubernetes/ssl/server-key.pem \
--trusted-ca-file=/opt/kubernetes/ssl/ca.pem \
--peer-trusted-ca-file=/opt/kubernetes/ssl/ca.pem
Restart=on-failure
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target

==复制时候注意换行符!!!!==

保存退出

将证书拷贝到kubernetes证书目录

# sudo cp ssl/server*pem ssl/ca*.pem /opt/kubernetes/ssl/

启动etcd

# sudo systemctl start etcd

查看是否启动


image.png
# ps -ef | grep etcd

设置为开机启动

# sudo systemctl enable etcd

为了集群以后的方便管理以及文件传输,我们做一个互信。
生成一个ssh证书

# sudo ssh-keygen

然后一路回车
生成之后在/root/.ssh/下可以看到一个公钥、一个私钥。


image.png

然后将公钥拷贝到节点上,即可免密码交互。

# sudo ssh-copy-id root@172.16.0.42
# sudo ssh-copy-id root@172.16.0.43

之后在两个节点下递归创建目录

# sudo mkdir -p /opt/kubernetes/{bin,cfg,ssl}

创建完之后将master节点下的etcd发送过去

# sudo scp -r /opt/kubernetes/bin/ root@172.16.0.42:/opt/kubernetes/
# sudo scp -r /opt/kubernetes/bin/ root@172.16.0.43:/opt/kubernetes/

再将配置文件传送过去

# sudo scp -r /opt/kubernetes/cfg/ root@172.16.0.42:/opt/kubernetes/
# sudo scp -r /opt/kubernetes/cfg/ root@172.16.0.43:/opt/kubernetes/

以及数字证书

# sudo scp -r /opt/kubernetes/ssl/ root@172.16.0.42:/opt/kubernetes/
# sudo scp -r /opt/kubernetes/ssl/ root@172.16.0.43:/opt/kubernetes/

还有配置文件

# sudo scp /usr/lib/systemd/system/etcd.service root@172.16.0.42:/usr/lib/systemd/system
# sudo scp /usr/lib/systemd/system/etcd.service root@172.16.0.43:/usr/lib/systemd/system

在node1以及node2分别修改配置文件

# sudo vi /opt/kubernetes/cfg/etcd

将其中的ETCD_NAME修改为节点名字以及IP地址修改为节点IP

image.png
image.png

修改完之后分别在两个节点下启动etcd

# sudo systemctl start etcd

设置为开机启动

# sudo systemctl enable etcd

查看集群状态:

/opt/kubernetes/bin/etcdctl \
--ca-file=ca.pem --cert-file=server.pem --key-file=server-key.pem \
--endpoints="https://172.16.0.41:2379,https://172.16.0.42:2379,https://172.16.0.43:2379" \
cluster-health
image.png

集群部署 – 部署Flannel网络

将flannel的二进制包上传至master,可以在依赖文件夹中找到
解压flannel

# sudo tar zxvf flannel-v0.9.1-linux-amd64.tar.gz
image.png

传送到node节点

# sudo scp flanneld mk-docker-opts.sh root@172.16.0.42:/opt/kubernetes/bin/
# sudo scp flanneld mk-docker-opts.sh root@172.16.0.43:/opt/kubernetes/bin/

在master节点写入分配的子网段到etcd,供flanneld使用

/opt/kubernetes/bin/etcdctl \
--ca-file=ca.pem --cert-file=server.pem --key-file=server-key.pem \
--endpoints="https://172.16.0.41:2379,https://172.16.0.42:2379,https://172.16.0.43:2379" \
set /coreos.com/network/config  '{ "Network": "172.17.0.0/16", "Backend": {"Type": "vxlan"}}'

Flannel只在node节点上部署,暂时不部署在master节点上。
新建文件flanneld

# sudo vi /opt/kubernetes/cfg/flanneld

添加以下内容

FLANNEL_OPTIONS="--etcd-endpoints=https://172.16.0.41:2379,https://172.16.0.42:2379,https://172.16.0.43:2379 --etcd-cafile=/opt/kubernetes/ssl/ca.pem --etcd-certfile=/opt/kubernetes/ssl/server.pem --etcd-keyfile=/opt/kubernetes/ssl/server-key.pem 

再添加一个systemd下的文件进行管理

# sudo vi /usr/lib/systemd/system/flanneld.service

添加下面内容

[Unit]
Description=Flanneld overlay address etcd agent
After=network-online.target network.target
Before=docker.service

[Service]
Type=notify
EnvironmentFile=/opt/kubernetes/cfg/flanneld
ExecStart=/opt/kubernetes/bin/flanneld --ip-masq $FLANNEL_OPTIONS
ExecStartPost=/opt/kubernetes/bin/mk-docker-opts.sh -k DOCKER_NETWORK_OPTIONS -d /run/flannel/subnet.env
Restart=on-failure

[Install]
WantedBy=multi-user.target

保存退出

更新配置

# sudo systemctl daemon_reload

启动flanneld

# sudo systemctl start flanneld

开机启动flanneld

# sudo systemctl enable flanneld

重启docker

# sudo systemctl restart docker

使用ifconfig命令可以看到flannel启动成功(安装ifconfig方法:yum -y install net-tools)

image.png

另一个节点跟以上配置一样。


image.png

用node2去ping node1的docker网关,ping通即说明flannel网络部署成功。

集群部署 – 创建Node节点kubeconfig文件

将kubeconfig.sh 上传至master节点。
修改权限

# sudo chmod +x kubeconfig.sh

修改kubeconfig.sh文件中的IP地址为master地址。

将kubectl上传至/opt/kubernetes/bin/目录下并修改权限

# sudo chmod +x /opt/kubernetes/bin/kubectl

设置环境变量

# sudo export PATH="/opt/kubernetes/bin/:$PATH"

环境变量生效

# sudo source /etc/profile

切换到生成证书的ssl目录,执行kubeconfig.sh

执行成功后目录下会生成kube-proxy.kubeconfig,bootstrap.kubeconfig, token.csv


image.png

将两个文件拷贝到两个节点的cfg目录下

# sudo scp *kubeconfig root@172.16.0.42:/opt/kubernetes/cfg/
# sudo scp *kubeconfig root@172.16.0.43:/opt/kubernetes/cfg/

集群部署 – 运行Master组件

将master.zip上传至master,node.zip上传至两个node
在master节点下创建master_pkg目录

# sudo mkdir master_pkg

将master.zip移动到master_pkg目录

# sudo mv master.zip master_pkg/

解压master.zip

# sudo unzip master.zip

可以看到以下文件

image.png

将三个二进制包移动到安装目录下

# sudo mv kube-apiserver kube-controller-manager kube-scheduler kubectl /opt/kubernetes/bin

增加执行权限

# sudo chmod +x /opt/kubernetes/bin/* && chmod +x *.sh

复制证书

# sudo cp ssl/ca*pem ssl/server*pem /opt/kubernetes/ssl/

token文件拷贝到cfg文件夹

# sudo cp ssl/token.csv /opt/kubernetes/cfg/

执行apiserver.sh

# sudo ./apiserver.sh 172.16.0.41 https://172.16.0.41:2379,https:// 172.16.0.42:2379,https:// 172.16.0.43:2379

可以看到system下生成kube-apiserver.service


image.png

启动kube-apiserver

#sudo systemctl start kube-apiserver

查看是否启动

#ps -ef | grep kube-apiserver
image.png

执行scheduler.sh

# sudo ./scheduler.sh 127.0.0.1

可以看到system下生成kube-scheduler

启动kube-scheduler.

# sudo systemctl start kube-scheduler

执行controller-manager.sh

# sudo ./controller-manager.sh 127.0.0.1

可以看到system下生成kube-controller-manager

启动kube-controller-manager

# sudo systemctl start kube-controller-manager

看一下集群健康状态

# sudo kubectl get cs
image.png

集群部署 – 运行Node组件

在master节点创建权限并绑定角色

kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --user=kubelet-bootstrap

解压node.zip文件
将kubelet,kube-proxy复制到bin目录下

# sudo mv kubelet kube-proxy /opt/kubernetes/bin

设置执行权限

# sudo chmod +x /opt/kubernetes/bin/* && chmod +x *.sh

执行kubelet.sh,ip地址为当前节点IP地址

# sudo ./kubelet.sh 172.16.0.42 10.10.10.2

查看是否启动

# ps -ef | grep kubelet
image.png

启动proxy,ip地址为当前节点IP地址

# sudo ./proxy.sh 172.16.0.42

查看是否启动

# ps -ef | grep kube-proxy
image.png

另一个节点同样执行以上操作

部署完成后再master上执行如下命令

# kubectl get node

此处会显示No sources found

执行命令

# kubectl get csr

将获取到的节点加进去即可

# kubectl certificate approve csr-jwf0q
# kubectl get componentstatus

得到如下结果即证明部署成功。

image.png

文章中所用资源连接

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,045评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,114评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,120评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,902评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,828评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,132评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,590评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,258评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,408评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,335评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,385评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,068评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,660评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,747评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,967评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,406评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,970评论 2 341

推荐阅读更多精彩内容