K8S/Kubernetes 二进制安装k8s v1.14.2版本

二进制安装k8s v1.14.2版本

k8s 核心架构:https://www.kubernetes.org.cn/4291.htmlk8s 高可用2个核心 apiserver master 和 etcdetcd:(需高可用)集群的数据中心,用于存放集群的配置以及状态信息,非常重要,如果数据丢失那么集群将无法恢复;因此高可用集群部署首先就是etcd是高可用集群;Apiserver:提供了资源操作的唯一入口,并提供...

k8s 核心架构:https://www.kubernetes.org.cn/4291.html

  • k8s 高可用2个核心 apiserver master 和 etcd

  • etcd:(需高可用)集群的数据中心,用于存放集群的配置以及状态信息,非常重要,如果数据丢失那么集群将无法恢复;因此高可用集群部署首先就是etcd是高可用集群;

  • Apiserver:提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制。整个集群中其他角色只有通过Apiserver才能访问etcd。CLI工具kubectl也是通过apiserver来对整体集群进行访问控制。

  • Controller-manager:负责维护集群的状态,比如故障检测、自动扩展、滚动更新等。一组k8s master上同一时间只有一个controller-manager角色进行工作,因为要避免控制冲突。

  • Scheduler:负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上。一组k8s master上同一时间只有一个scheduler角色进行工作,同样因为要避免控制冲突。

  • Kubelet:负责pod对应的容器的创建、启停等任务,同时也负责Volume(CVI)和网络(CNI)的管理。

  • kube-proxy: 每个node上一个,负责service vip到endpoint pod的流量转发和负载均衡,老版本主要通过设置iptables规则实现,新版1.9基于kube-proxy-lvs 实现

           访问部署在kubernetes集群中服务,有两种类型:

            集群内部实现访问

            集群外部实现访问

但是不管是集群内部还是外部访问都是要经过kube-proxy的

环境初始化

1.安装之前关闭所有节点的防火墙和selinux

systemctl stop firewalld

systemctl disable firewalld

[root@test ~]# getenforce

Disabled

master

172.20.103.1

node

172.20.103.2

node

172.20.103.3


master上部署的服务:etcd、kube-apiserver、kube-controller-manager、kube-scheduler


etcd服务:见笔记(etcd高可用集群

etcd服务作为k8s集群的主数据库,在安装k8s各服务之前需要首先安装和启动


Master安装:

下载最新的二进制版本kubernetes-server-linux-amd64.tar.gz并解压缩,然后在解压缩文件中,找到./kubernetes/server/bin包含所有必需的二进制文件的文件。

如果用https协议下载报错,可以用http方式连接,使用“--no-check-certificate”

wget  https://storage.googleapis.com/kubernetes-release/release/v1.14.2/kubernetes-server-linux-amd64.tar.gz

tar -zxf kubernetes-server-linux-amd64.tar.gz

cd /opt/kubernetes/server/bin

cp kube-apiserver kube-controller-manager  kube-scheduler kubectl  /usr/bin/ 

创建master端主配置文件:


创建存放配置文件的目录

mkdir -p /etc/kubernetes

mkdir -p /etc/kubernetes/logs

kube-apiserver 服务


创建kube-apiserver的systemd配置文件:vim /usr/lib/systemd/system/kube-apiserver.service

[Unit]

Description=Kubernetes API Server

Documentation=https://github.com/GoogleCloudPlatform/kubernetes

After=etcd.service

Wants=etcd.service

[Service]

EnvironmentFile=-/etc/kubernetes/apiserver

ExecStart=/usr/bin/kube-apiserver $KUBE_API_ARGS

Restart=on-failure

Type=notify

LimitNOFILE=65536

[Install]

WantedBy=multi-user.target

配置文件/etc/kubernetes/apiserver的内容包括了kube-apiserver的全部启动参数,主要的配置参数在变量KUBE_API_ARGS中指定。


vim  /etc/kubernetes/apiserver


KUBE_API_ARGS="--etcd-servers=http://127.0.0.1:2379  --insecure-bind-address=0.0.0.0  --insecure-port=8080  --service-cluster-ip-range=169.169.0.0/16  --service-node-port-range=1-65535  --enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota  --logtostderr=false  --log-dir=/etc/kubernetes/logs  --v=0"

启动参数说明如下:

--storage-backend:指定etcd的版本,从k8s1.6开始,默认为etcd3。在1.6之前的版本中没有这个参数,kube-apiserver默认使用etcd2。

--etcd-servers:指定etcd服务的URL

--insecure-bind-address:api server绑定主机的非安全IP地址,设置0.0.0.0表示绑定所有IP地址

--insecure-port:api server绑定主机的非安全端口号,默认为8080

--service-cluster-ip-range:k8s集群中service的虚拟IP地址范围,该IP范围不能与物理机的IP地址有重合。以CIDR格式表示,例如169.169.0.0/16 。

--service-node-port-range:k8s集群中service可使用的物理机端口号范围,默认值30000~32767。

--enable-admission-plugins:k8s集群的准入控制设置,各控制模块以插件的形式依次生效。

--logtostderr:设置为false表示将日志写入文件,不写入stderr。

--log-dir:日志目录

--v:日志级别




kube-controller-manager 服务


kube-controller-manager服务依赖于kube-apiserver服务


创建kube-controller-manager的systemd配置文件:vim /usr/lib/systemd/system/kube-controller-manager.service

[Unit]

Description=Kubernetes Controller Manager

Documentation=https://github.com/GoogleCloudPlatform/kubernetes

After=kube-apiserver.service

Requires=kube-apiserver.service

[Service]

EnvironmentFile=/etc/kubernetes/controller-manager

ExecStart=/usr/bin/kube-controller-manager  $KUBE_CONTROLLER_MANAGER_ARGS

Restart=on-failure

LimitNOFILE=65536

[Install]

WantedBy=multi-user.target


配置文件/etc/kubernetes/controller-manager的内容包含了kube-controller-manager的全部启动参数,主要的配置参数在变量KUBE_CONTROLLER_MANAGER_ARGS中指定:


vim /etc/kubernetes/controller-manager


KUBE_CONTROLLER_MANAGER_ARGS="--kubeconfig=/etc/kubernetes/kubeconfig  --logtostderr=false  --log-dir=/etc/kubernetes/logs  --v=0"

启动参数说明如下:

--kubeconfig:设置与api server 连接的相关配置,vim /etc/kubernetes/kubeconfig


apiVersion: v1

kind: Config

users:

- name: client

clusters:

- name: default

  cluster:

    server: http://api_server_ip:8080

contexts:

- context:

    cluster: default

    user: client

  name: default

current-context: default


--logtostderr:设置为false表示将日志写入文件,不写入stderr。

--log-dir:日志目录

--v:日志级别

kube-scheduler 服务

kube-scheduler 服务也依赖于kube-apiserver服务

创建kube-scheduler的systemd配置文件:vim /usr/lib/systemd/system/kube-scheduler.service

[Unit]

Description=Kubernetes Scheduler Plugin

Documentation=https://github.com/GoogleCloudPlatform/kubernetes

After=kube-apiserver.service

Requires=kube-apiserver.service

[Service]

EnvironmentFile=/etc/kubernetes/scheduler

ExecStart=/usr/bin/kube-scheduler  $KUBE_SCHEDULER_ARGS

Restart=on-failure

LimitNOFILE=65536

[Install]

WantedBy=multi-user.target

配置文件/etc/kubernetes/scheduler 的内容包含了kube-scheduler 的全部启动参数,主要的配置参数在变量KUBE_SCHEDULER_ARGS 中指定:

vim  /etc/kubernetes/scheduler

KUBE_SCHEDULER_ARGS="--kubeconfig=/etc/kubernetes/kubeconfig  --logtostderr=false  --log-dir=/etc/kubernetes/logs  --v=0"

启动参数说明如下:

--kubeconfig:设置与api server 连接的相关配置,可以与kube-controller-manager使用的kubeconfig 文件相同。

--logtostderr:设置为false表示将日志写入文件,不写入stderr。

--log-dir:日志目录

--v:日志级别

启动服务

搭建完成之后先启动etcd然后在启动其他服务,执行systemctl start 命令按顺序启动这3个服务,同时使用systemctl enable命令将服务加入开机启动列表中。

systemctl daemon-reload

systemctl enable kube-apiserver kube-controller-manager kube-scheduler

systemctl start kube-apiserver

systemctl start kube-controller-manager

systemctl start kube-scheduler

查看服务启动状态

systemctl status kube-apiserver kube-controller-manager kube-scheduler

至此,kubernetes master上所需的服务就全部启动完成了。

如果搭建集群,我们在三台master主机上重复以上搭建步骤,注意配置文件中需要修改IP地址的地方,以及需要先启动etcd,然后依次启动kube-apiserver,kube-controller-manager,kube-scheduler。

验证master上组件健康:kubectl get cs

[root@test ~]# kubectl get cs

NAME                 STATUS    MESSAGE              ERROR

scheduler            Healthy   ok                  

controller-manager   Healthy   ok                  

etcd-0               Healthy   {"health": "true"}  



Node上部署的服务kubelet、kube-proxy、flannel(网络组建)


在node上需要预先安装好docker,先别启动,等配置好fannel之后再启动。


yum -y install docker

yum -y install flannel

编辑配置文件 vim  /etc/sysconfig/flanneld 设置etcd的url地址

FLANNEL_ETCD_ENDPOINTS="http://172.20.103.1:2379"        #flannel从etcd中读取配置

FLANNEL_ETCD_PREFIX="/coreos.com/network"                     #/coreos.com/network masteretcd网络授权的文件,这个需要在启动flanneld之前在master端手动生成

在启动flanneld 服务之前,需要在master端etcd中添加一条网络配置记录,这个配置将用于flanneld分配给每个docker的虚拟ip地址段。


etcdctl set /coreos.com/network/config  '{"Network":"10.10.0.0/16"}'

查看是否添加成功

etcdctl get /coreos.com/network/config

由于flannel将覆盖docker0网桥,所以如果docker服务已经启动,则需要先停止docker服务。

systemctl enable flanneld

systemctl start flanneld

systemctl enable docker

我们可以在etcd中查看flannel设置的地址与物理机IP地址的对应规则:

etcdctl ls /coreos.com/network/subnets

etcdctl get /coreos.com/network/subnets/10.10.92.0-24

spacer.gif

tar -zxf kubernetes-server-linux-amd64.tar.gz

cd /opt/kubernetes/server/bin

cp kubelet kube-proxy  /usr/bin/ 

创建Node端主配置文件

创建存放配置文件的目录

mkdir -p /etc/kubernetes

mkdir -p /etc/kubernetes/logs


kubelet服务

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

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


kubelet服务依赖于docker 服务


创建kubelet的systemd 服务配置文件 vim /usr/lib/systemd/system/kubelet.service

[Unit]

Description=Kubernetes Kubelet Server

Documentation=https://github.com/GoogleCloudPlatform/kubernetes

After=docker.service

Requires=docker.service

[Service]

WorkingDirectory=/var/lib/kubelet

EnvironmentFile=/etc/kubernetes/kubelet

ExecStart=/usr/bin/kubelet  $KUBELET_ARGS

Restart=on-failure

[Install]

WantedBy=multi-user.target

其中,WorkingDirectory 表示kubelet保存数据的目录,需要在启动kubelet 服务之前创建。

mkdir -p /var/lib/kubelet

配置文件/etc/kubernetes/kubelet 的内容包含了kubelet 的全部启动参数,主要的配置参数在变量KUBELET_ARGS 中指定:

vim /etc/kubernetes/kubelet


KUBELET_ARGS="--kubeconfig=/etc/kubernetes/kubeconfig  --fail-swap-on=false  --cgroup-driver=systemd  --hostname-override=172.20.103.2  --logtostderr=false  --log-dir=/etc/kubernetes/logs  --v=0"

启动参数说明如下:

--kubeconfig:设置与api server 连接的相关配置,可以与kube-controller-manager使用的kubeconfig 文件相同。

--fail-swap-on=false:设置为true表示如果主机启用了swap,kubelet组件将无法启动,默认值为true。Kubernetes v1.8+ 要求关闭系统 Swap,若不关闭则需要修改kubelet设定参数。

--cgroup-driver=systemd:用于操作本机cgroup的驱动模式,支持groupfs或者systemd,默认值为cgroupfs。docker使用的文件驱动默认systemd, 两边不一致会导致kubelet组件无法启动。

vim /etc/kubernetes/kubeconfig


apiVersion: v1

kind: Config

users:

- name: client

clusters:

- name: default

  cluster:

    server: http://api_server_ip:8080

contexts:

- context:

    cluster: default

    user: client

  name: default

current-context: default


--hostname-override:设置本node的名称

--logtostderr:设置为false表示将日志写入文件,不写入stderr。

--log-dir:日志目录

--v:日志级别

kube-proxy 服务

kube-proxy 服务依赖于network 服务

创建kube-proxy的systemd配置文件 vim /usr/lib/systemd/system/kube-proxy.service

[Unit]

Description=Kubernetes Kube-Proxy Server

Documentation=https://github.com/GoogleCloudPlatform/kubernetes

After=network.target

Requires=network.service

[Service]

EnvironmentFile=/etc/kubernetes/proxy

ExecStart=/usr/bin/kube-proxy  $KUBE_PROXY_ARGS

Restart=on-failure

LimitNOFILE=65536

[Install]

WantedBy=multi-user.target

配置文件/etc/kubernetes/proxy内容包括了kube-proxy的全部启动参数,主要的配置参数在变量 KUBE_PROXY_ARGS 中指定。

vim /etc/kubernetes/proxy

 

KUBE_PROXY_ARGS="--kubeconfig=/etc/kubernetes/kubeconfig  --logtostderr=false  --log-dir=/etc/kubernetes/logs  --v=2"

启动参数说明如下:

--kubeconfig:设置与api server 连接的相关配置,可以与kube-controller-manager使用的kubeconfig 文件相同。

--logtostderr:设置为false表示将日志写入文件,不写入stderr。

--log-dir:日志目录

--v:日志级别

配置完成后,启动服务

systemctl daemon-reload

systemctl enable kubelet kube-proxy

systemctl start kubelet kube-proxy

systemctl status kubelet kube-proxy

kubelet 默认采用向master自动注册本node的机制,在master上查看各node的状态,状态为ready表示node已经成功注册并且状态为可用:

kubectl get nodes


Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐

  • 浏览量 434
  • 收藏 0
  • 0

所有评论(0)

查看更多评论 
已为社区贡献4条内容