千家信息网

CentOS7.5 使用二进制程序部署Kubernetes1.12.2(三)

发表于:2025-01-31 作者:千家信息网编辑
千家信息网最后更新 2025年01月31日,一、安装方式介绍1、yum 安装目前CentOS官方已经把Kubernetes源放入到自己的默认 extras 仓库里面,使用 yum 安装,好处是简单,坏处也很明显,需要官方更新 yum 源才能获得
千家信息网最后更新 2025年01月31日CentOS7.5 使用二进制程序部署Kubernetes1.12.2(三)

一、安装方式介绍

1、yum 安装

目前CentOS官方已经把Kubernetes源放入到自己的默认 extras 仓库里面,使用 yum 安装,好处是简单,坏处也很明显,需要官方更新 yum 源才能获得最新版本的软件,而所有软件的依赖又不能自己指定,尤其是你的操作系统版本如果低的话,使用 yum 源安装的 Kubernetes 的版本也会受到限制,通常会低于官方很多版本,我安装的时候目前官方版本为1.12,而 yum 源中的版本为1.5.2
请查看博文:https://blog.51cto.com/wzlinux/2321767

2、二进制安装

使用二进制文件安装,好处是可以安装任意版本的 Kubernetes,对一些新版本新功能追求的同学比较合适,坏处是配置比较复杂,很多软件包因为一些原因,我们在大陆是访问不到的。

3、Kubeadm 安装

kubeadm 是 Kubernetes 官方提供的用于快速安装 Kubernetes 集群的工具,伴随Kubernetes每个版本的发布都会同步更新,kubeadm会对集群配置方面的一些实践做调整,通过实验 kubeadm 可以学习到 Kubernetes 官方在集群配置上一些新的最佳实践。
请查看博文:https://blog.51cto.com/wzlinux/2322616

这里我们选用第二种方式安装。

二、环境准备

1、软件版本

我们安装的版本基本是目前最新的版本。

软件版本
kubernetesv1.12.2
CentOS 7.5CentOS Linux release 7.5.1804
Dockerv18.06 这是官方推荐的
etcd3.3.10
flannel0.10.0

2、节点规划

IP角色安装软件
172.18.8.200k8s masteretcd,kube-apiserver,kube-controller-manager,kube-scheduler,kubelet
172.18.8.201k8s node01docker,kubelet,kube-proxy,flannel
172.18.8.202k8s node02docker,kubelet,kube-proxy,flannel

节点及网络规划如下:

3、系统配置

关闭防火墙。

systemctl stop firewalldsystemctl disable firewalld

配置/etc/hosts,添加如下内容。

172.18.8.200 master.wzlinux.com master172.18.8.201 node01.wzlinux.com node01172.18.8.202 node02.wzlinux.com node02

关闭SELinux。

sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/configsetenforce 0

关闭swap。

swapoff -ased -i 's/.*swap.*/#&/' /etc/fstab

4、二进制软件包下载

我们可以下载编译好的二进制文件,也可以下载源码自己编译,这里只讨论二进制的安装方式。在Kubernetes的Github CHANGELOG日志中可以看到最新的版本号,也可以到Tag页面中找到自己需要的版本,我下载的是 v1.12.2。

上传我们下载的二进制软件包到各节点,并解压在root家目录,查看目录内容。

[root@master ~]# ll kubernetes/server/bin/total 1821524-rwxr-xr-x 1 root root  60859975 Oct 24 15:49 apiextensions-apiserver-rwxr-xr-x 1 root root 142923436 Oct 24 15:49 cloud-controller-manager-rw-r--r-- 1 root root         8 Oct 24 15:44 cloud-controller-manager.docker_tag-rw-r--r-- 1 root root 144309760 Oct 24 15:44 cloud-controller-manager.tar-rwxr-xr-x 1 root root 248021112 Oct 24 15:49 hyperkube-rwxr-xr-x 1 root root  54042644 Oct 24 15:49 kubeadm-rwxr-xr-x 1 root root 192781649 Oct 24 15:49 kube-apiserver-rw-r--r-- 1 root root         8 Oct 24 15:44 kube-apiserver.docker_tag-rw-r--r-- 1 root root 194167808 Oct 24 15:44 kube-apiserver.tar-rwxr-xr-x 1 root root 162961401 Oct 24 15:49 kube-controller-manager-rw-r--r-- 1 root root         8 Oct 24 15:44 kube-controller-manager.docker_tag-rw-r--r-- 1 root root 164347392 Oct 24 15:44 kube-controller-manager.tar-rwxr-xr-x 1 root root  57352138 Oct 24 15:49 kubectl-rwxr-xr-x 1 root root 176648680 Oct 24 15:49 kubelet-rwxr-xr-x 1 root root  50330867 Oct 24 15:49 kube-proxy-rw-r--r-- 1 root root         8 Oct 24 15:44 kube-proxy.docker_tag-rw-r--r-- 1 root root  98355200 Oct 24 15:44 kube-proxy.tar-rwxr-xr-x 1 root root  57184656 Oct 24 15:49 kube-scheduler-rw-r--r-- 1 root root         8 Oct 24 15:44 kube-scheduler.docker_tag-rw-r--r-- 1 root root  58570752 Oct 24 15:44 kube-scheduler.tar-rwxr-xr-x 1 root root   2330265 Oct 24 15:49 mounter

这些包都是存储在google的服务器上面,因为众所周知的原因,我们是无法访问的,所以需要各位科学上网才可以获取,不过我可以把我获取的包传到网盘分享给大家。
大家可以去下载使用。链接: https://pan.baidu.com/s/1Ut9VERgm55B4lmz0wjjzFQ 提取码: mjem

三、安装master

master节点需要安装的服务有kube-apiserverkube-controller-managerkube-scheduler,所以我们先把需要的二进制文件放到环境变量。

cd /root/kubernetes/server/bincp kube-apiserver kube-controller-manager kube-scheduler kubectl /usr/local/bin/

创建需要的目录。

mkdir -p /var/lib/etcdmkdir -p /etc/etcd/mkdir /etc/kubernetes

1、安装etcd

因为所以的组件都是需要etcd存储,所以我们第一安装的就是etcd,如果不是为了新版本,为了方便可以使用yum安装。

我这里采用二进制安装方法,首先下载安装包。

下载。

wget https://github.com/etcd-io/etcd/releases/download/v3.3.10/etcd-v3.3.10-linux-amd64.tar.gz

解压安装。

tar xf etcd-v3.3.10-linux-amd64.tar.gzcd etcd-v3.3.10-linux-amd64cp etcd etcdctl /usr/local/bin/

创建system启动文件etcd.service

cat < /usr/lib/systemd/system/etcd.service[Unit]Description=etcd.service[Service]Type=notifyTimeoutStartSec=0Restart=alwaysWorkingDirectory=/var/lib/etcdEnvironmentFile=-/etc/etcd/etcd.confExecStart=/usr/local/bin/etcd[Install]WantedBy=multi-user.targetEOF

创建配置文件。

cat </etc/etcd/etcd.confETCD_NAME=ETCD ServerETCD_DATA_DIR="/var/lib/etcd/"ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379ETCD_ADVERTISE_CLIENT_URLS="http://172.18.8.200:2379"EOF

启动etcd。

systemctl daemon-reloadsystemctl start etcd.servicesystemctl enable etcd.service

查看启动状态。

[root@master ~]# netstat -tlnp|grep etcdtcp        0      0 127.0.0.1:2380          0.0.0.0:*               LISTEN      1550/etcd           tcp6       0      0 :::2379                 :::*                    LISTEN      1550/etcd    [root@master ~]# etcdctl cluster-healthmember 8e9e05c52164694d is healthy: got healthy result from http://172.18.8.200:2379cluster is healthy

说明: etcd 会启用两个端口,其中2380 是集群的通信端口,2379是服务端口。如果是配置etcd集群,则要修改配置文件,设置监听IP和端口。

2、安装 kube-apiserver

创建启动文件/usr/lib/systemd/system/kube-apiserver.service,修改为如下内容:

[Unit]Description=Kubernetes API ServerDocumentation=https://github.com/GoogleCloudPlatform/kubernetesAfter=network.targetAfter=etcd.service[Service]EnvironmentFile=/etc/kubernetes/apiserverExecStart=/usr/local/bin/kube-apiserver  \        $KUBE_ETCD_SERVERS \        $KUBE_BIND_ADDRESS \        $KUBE_API_PORT \        $KUBE_SERVICE_ADDRESSES \        $KUBE_ADMISSION_CONTROL \        $KUBE_API_ARGSRestart=on-failureType=notifyLimitNOFILE=65536[Install]WantedBy=multi-user.target

创建目录和配置文件。

cat < /etc/kubernetes/apiserverKUBE_BIND_ADDRESS="--bind-address=0.0.0.0"KUBE_API_PORT="--port=8080"KUBE_ETCD_SERVERS="--etcd-servers=http://172.18.8.200:2379"KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.96.0.0/12"KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"KUBE_API_ARGS=""EOF

启动服务。

systemctl daemon-reloadsystemctl start kube-apiserver.servicesystemctl enable kube-apiserver.service

查看启动是否成功。

[root@master ~]# netstat -tnlp | grep kubetcp6       0      0 :::6443                 :::*                    LISTEN      11086/kube-apiserve tcp6       0      0 :::8080                 :::*                    LISTEN      11086/kube-apiserve 

kube-apiserver监听在两个端口,6443是https加密通信方式,8080是http的通信方式,我们这里没有配置证书选项,所以我们的通信都是明文通信,官方文档查看。

3、安装kube-controller-manager

创建启动文件/usr/lib/systemd/system/kube-controller-manager.service,添加如下内容:

[Unit]Description=Kubernetes Controller ManagerDocumentation=https://github.com/GoogleCloudPlatform/kubernetesAfter=kube-apiserver.serviceRequires=kube-apiserver.service[Service]EnvironmentFile=-/etc/kubernetes/controller-managerExecStart=/usr/local/bin/kube-controller-manager \             $KUBE_MASTER \             $KUBE_CONTROLLER_MANAGER_ARGSRestart=on-failureLimitNOFILE=65536[Install]WantedBy=multi-user.target

创建配置文件controller-manager,IP根据自己的实际情况进行修改。

cat < /etc/kubernetes/controller-managerKUBE_MASTER="--master=http://172.18.8.200:8080"KUBE_CONTROLLER_MANAGER_ARGS=""EOF

启动服务。

systemctl daemon-reloadsystemctl start kube-controller-manager.servicesystemctl enable kube-controller-manager.service

验证服务状态。

[root@master ~]# netstat -lntp | grep kube-controlltcp6       0      0 :::10252                :::*                    LISTEN      11131/kube-controll tcp6       0      0 :::10257                :::*                    LISTEN      11131/kube-controll 

端口10257为https提供身份验证和授权,10252为默认非加密端口,官方文档查看。

4、安装kube-scheduler

创建启动文件/usr/lib/systemd/system/kube-scheduler.service,添加如下内容:

[Unit]Description=Kubernetes Scheduler PluginDocumentation=https://github.com/GoogleCloudPlatform/kubernetesAfter=kube-apiserver.serviceRequires=kube-apiserver.service[Service]EnvironmentFile=/etc/kubernetes/schedulerExecStart=/usr/local/bin/kube-scheduler \        $KUBE_MASTER \        $KUBE_SCHEDULER_ARGSRestart=on-failureLimitNOFILE=65536[Install]WantedBy=multi-user.target

创建配置文件/etc/kubernetes/scheduler

cat < /etc/kubernetes/schedulerKUBE_MASTER="--master=http://172.18.8.200:8080"KUBE_SCHEDULER_ARGS=""EOF

启动服务。

systemctl daemon-reloadsystemctl start kube-scheduler.servicesystemctl enable kube-scheduler.service

验证服务状态。

[root@master ~]# netstat -lntp | grep kube-scheduletcp6       0      0 :::10251                :::*                    LISTEN      11178/kube-schedule 

端口10251是非加密端口,https端口为10259。官方文件查看。

使用 kubectl 查看状态。

[root@master ~]# kubectl get csNAME                 STATUS    MESSAGE             ERRORetcd-0               Healthy   {"health":"true"}   controller-manager   Healthy   ok                  scheduler            Healthy   ok                  

四、安装node节点(node01为例)

1、环境准备

node节点需要安装的服务有dockerkubeletkube-proxflannel,所以我们先把需要的二进制文件放到环境变量。

cd /root/kubernetes/server/bin/cp kubelet kube-proxy /usr/local/bin/

加载ipvs内核,使node节点kube-proxy支持ipvs代理规则。

modprobe ip_vs_rrmodprobe ip_vs_wrrmodprobe ip_vs_sh

创建需要的目录。

mkdir /var/lib/kubeletmkdir /etc/kubernetes

配置转发参数。

cat <  /etc/sysctl.d/k8s.confnet.bridge.bridge-nf-call-ip6tables = 1net.bridge.bridge-nf-call-iptables = 1EOFsysctl --system

2、安装docker-ce

我们使用推荐的版本18.06,此时docker官方的最新版本为18.09,所以我们需要配置官方yum源。

wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -P /etc/yum.repos.d/
yum list docker-ce.x86_64  --showduplicates |sort -ryum install docker-ce-18.06.1.ce -y

配置加速器。

sudo mkdir -p /etc/dockersudo tee /etc/docker/daemon.json <<-'EOF'{  "registry-mirrors": ["https://hdi5v8p1.mirror.aliyuncs.com"]}EOF

2、安装 kube-proxy 服务

创建启动文件/usr/lib/systemd/system/kube-proxy.service,添加如下内容:

[Unit]Description=Kubernetes Kube-Proxy ServerDocumentation=https://github.com/GoogleCloudPlatform/kubernetesAfter=network.target[Service]EnvironmentFile=/etc/kubernetes/proxyExecStart=/usr/local/bin/kube-proxy \            $KUBE_MASTER \            $KUBE_PROXY_ARGSRestart=on-failureLimitNOFILE=65536[Install]WantedBy=multi-user.target

创建需要的配置文件,IP请根据自己的实际情况进行修改。

cat < /etc/kubernetes/proxyKUBE_MASTER="--master=http://172.18.8.200:8080"KUBE_PROXY_ARGS=""EOF

启动服务。

systemctl daemon-reloadsystemctl start kube-proxy.servicesystemctl enable kube-proxy.service

查看启动状态。

[root@node01 ~]# netstat -lntp | grep kube-proxytcp        0      0 127.0.0.1:10249         0.0.0.0:*               LISTEN      12273/kube-proxy    tcp6       0      0 :::10256                :::*                    LISTEN      12273/kube-proxy  

端口10256负责健康检查,10249负责和server通信,官方文档查看。

3、安装 kubelete 服务

创建启动文件/usr/lib/systemd/system/kubelet.service,新增如下内容:

[Unit]Description=Kubernetes Kubelet ServerDocumentation=https://github.com/GoogleCloudPlatform/kubernetesAfter=docker.serviceRequires=docker.service[Service]WorkingDirectory=/var/lib/kubeletExecStart=/usr/local/bin/kubelet --kubeconfig=/etc/kubernetes/kubeconfig.yamlRestart=on-failure[Install]WantedBy=multi-user.target

创建配置文件kubeconfig.yaml,具体参数请根据自己的需求进行修改,新增如下内容:

cat < /etc/kubernetes/kubeconfig.yamlapiVersion: v1kind: Configusers:- name: kubeletclusters:- name: kubernetes  cluster:     server: http://172.18.8.200:8080contexts:- context:    cluster: kubernetes    user: kubelet  name: service-account-contextcurrent-context: service-account-contextEOF

kubeconfig官方文档请点击查看。

启动kubelet。

systemctl daemon-reloadsystemctl start kubelet.servicesystemctl enable kubelet.service

查看启动情况。

[root@node01 ~]# netstat -tnlp | grep kubelettcp        0      0 127.0.0.1:43228         0.0.0.0:*               LISTEN      12658/kubelet       tcp        0      0 127.0.0.1:10248         0.0.0.0:*               LISTEN      12658/kubelet       tcp6       0      0 :::10250                :::*                    LISTEN      12658/kubelet       tcp6       0      0 :::10255                :::*                    LISTEN      12658/kubelet   

配置官方文档请查看。

4、配置flannel网络(Pod使用)

我们之所以要单独使用第三方的网络插件来扩展k8s,主要原因是在使用docker的环境中,在每个node节点的docker0默认的网段都是172.17.0.0/16的网络。如果要实现不同宿主node上pod(这里也可以理解为容器)互相通信,就不能使用默认的docker0提供的网段,我们需要部署一个覆盖网络,让每个node节点的docker0网络都处于不同的网段,这样,通过添加一些路由转发策略,就能让集群中各个pod在同一个虚拟的网络中实现通信。

从github官网下载最新版本。

wget https://github.com/coreos/flannel/releases/download/v0.10.0/flannel-v0.10.0-linux-amd64.tar.gztar xf flannel-v0.10.0-linux-amd64.tar.gzcp flanneld /usr/local/bin/cp mk-docker-opts.sh /usr/local/libexec/

创建启动文件/usr/lib/systemd/system/flanneld.service,新增如下内容:

[Unit]Description=Flanneld overlay address etcd agentAfter=network.targetAfter=network-online.targetWants=network-online.targetAfter=etcd.serviceBefore=docker.service[Service]Type=notifyEnvironmentFile=/etc/sysconfig/flanneldEnvironmentFile=-/etc/sysconfig/docker-networkExecStart=/usr/local/bin/flanneld \            $FLANNEL_ETCD_ENDPOINTS \            $FLANNEL_ETCD_PREFIX \            $FLANNEL_OPTIONSExecStartPost=/usr/local/libexec/mk-docker-opts.sh -d /run/flannel/dockerRestart=on-failure[Install]WantedBy=multi-user.targetRequiredBy=docker.service

对上面的文件做一下解释:

  • Flannel网络必须在宿主机网络能对外(其它node节点)正常通信的情况下启动才有意义,所以这里定义After=network.target
  • 只有当Flannel 网络启动之后,才能创建一个与其它节点不会冲突的网络,而docker的网络需要和fannel 网络相同才能保证跨主机通信,所以docker必须要在flannel网络创建后才能启动,这里定义Before=docker.service

创建配置文件/etc/sysconfig/flanneld,设置为如下内容:

cat < /etc/sysconfig/flanneld# Flanneld configuration options  # etcd url location.  Point this to the server where etcd runsFLANNEL_ETCD_ENDPOINTS="-etcd-endpoints=http://172.18.8.200:2379"# etcd config key.  This is the configuration key that flannel queries# For address range assignmentFLANNEL_ETCD_PREFIX="-etcd-prefix=/atomic.io/network"# Any additional options that you want to passFLANNEL_OPTIONS=""EOF

在master节点上为 falnnel 创建分配的网络。

[root@master ~]#  etcdctl mk /atomic.io/network/config '{"Network": "10.244.0.0/16"}'

在各node节点上启动 flannel。

systemctl daemon-reloadsystemctl start flanneld.servicesystemctl enable flanneld.service

检查是否启动好。

ps -ef |grep flanneld

也可以使用自助安装,官方建议的使用方法。
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

5、启动docker

编辑文件/usr/lib/systemd/system/docker.service,修改为如下内容,让docker使用flannel网络。

[Unit]Description=Docker Application Container EngineDocumentation=https://docs.docker.comAfter=network-online.target firewalld.service flannel.serviceWants=network-online.targetRequires=flanneld.service[Service]Type=notifyEnvironmentFile=-/run/flannel/dockerExecStart=/usr/bin/dockerd $DOCKER_OPTSExecReload=/bin/kill -s HUP $MAINPIDLimitNOFILE=infinityLimitNPROC=infinityLimitCORE=infinityTimeoutStartSec=0Delegate=yesKillMode=processRestart=on-failureStartLimitBurst=3StartLimitInterval=60s[Install]WantedBy=multi-user.target

我们最后启动docker服务。

systemctl daemon-reloadsystemctl restart docker.servicesystemctl enable docker.service

我们可以看到docker0已经连接到flannel0,并且添加10.244.71.0/24的路由。

[root@node01 ~]# ip rdefault via 172.18.8.1 dev ens33 proto static metric 100 10.244.0.0/16 dev flannel0 proto kernel scope link src 10.244.71.0 10.244.71.0/24 dev docker0 proto kernel scope link src 10.244.71.1 172.18.0.0/16 dev ens33 proto kernel scope link src 172.18.8.201 metric 100  

五、master节点验证

[root@master ~]# kubectl get nodesNAME                 STATUS   ROLES    AGE     VERSIONnode01.wzlinux.com   Ready       5m38s   v1.12.2node02.wzlinux.com   Ready       5m34s   v1.12.2

先运行几个pod看一下。

kubectl run nginx --image=nginx --replicas=3

查看一下pod状态,发现容器的状态为ContainerCreating,使用kubectl describe pod POD_NAME发现在请求k8s.gcr.io/pause:3.1pod镜像模板。

因为我们还没有pod基础设施镜像k8s.gcr.io/pause:3.1,就是所有pod的模板,我们需要从gcr.io下载,但是这个地址我们国内是无法访问的,我们可以使用间接的方法,在所有的node节点上,我们可以从阿里云的镜像下载,然后再tag成我们需要的镜像。

docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.1docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.1 k8s.gcr.io/pause:3.1docker image rm registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.1

问题解决之后我们再次查看。

[root@master ~]# kubectl get pods -o wideNAME                    READY   STATUS    RESTARTS   AGE     IP            NODE                 NOMINATED NODEnginx-dbddb74b8-gzd6j   1/1     Running   0          2m11s   10.244.50.3   node02.wzlinux.com   nginx-dbddb74b8-hmmll   1/1     Running   0          2m11s   10.244.50.2   node02.wzlinux.com   nginx-dbddb74b8-lpkln   1/1     Running   0          2m11s   10.244.71.2   node01.wzlinux.com   

当前的网络结构图如下所示:

我们可以创建一个service,查看其分配的IP。

[root@master ~]# kubectl expose deploy nginx --port=8888 --target-port=80[root@master ~]# kubectl get svcNAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGEkubernetes   ClusterIP   10.96.0.1               443/TCP    51mnginx        ClusterIP   10.98.190.189           8888/TCP   7s

至此,使用二进制程序搭建的过程我们已经介绍完了。

文件 配置 版本 网络 官方 节点 服务 内容 端口 二进制 通信 软件 状态 集群 文档 方式 环境 目录 情况 镜像 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 数据库灾难恢复 三级数据库考试环境 商品销售管理系统数据库设计代码 ftp开源服务器 软件开发过程中客户端是干什么的 为什么要选择ubuntu服务器 网络安全和技术的区别 发生网络安全时间 应当 大学生网络安全大赛获奖作品 ESP32连接http服务器 数据库能同时修改多条命令吗 视频系统分布式服务器 小型服务器一个月多少钱 游戏软件开发包括哪些 北京访客管理软件开发报价 青浦区海航软件开发供应商家 如皋市志雷网络技术工作室 数据库注入式工具 数据库系统概论高等教育出版社 软件开发的客户资源哪里找 软件开发培训认证 朔州软件开发平均价格 库存监控软件开发 信息科技部数据库日常运维项目 王牌战争开服务器怎么设定 杭州巨旗互联网络科技 写论文如何引用网上数据库 网络安全类的书籍 数据库注入式工具 嵌入式web服务器配置ip地址
0