千家信息网

CentOS 7.5 使用 yum 安装 Kubernetes 集群(二)

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

一、安装方式介绍

1、yum 安装

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

2、二进制安装

使用二进制文件安装,好处是可以安装任意版本的 Kubernetes,坏处是配置比较复杂,很多软件包因为一些原因,我们在大陆是访问不到的。
请查看博文:https://blog.51cto.com/wzlinux/2322345

3、Kubeadm 安装

kubeadm 是 Kubernetes 官方提供的用于快速安装 Kubernetes 集群的工具,伴随Kubernetes每个版本的发布都会同步更新,kubeadm会对集群配置方面的一些实践做调整,通过实验 kubeadm 可以学习到 Kubernetes 官方在集群配置上一些新的最佳实践。

1.4 版本对于Linux主要发行版本Ubuntu Xenial和Red Hat centos7的用户,可以使用熟悉的 apt-get 和 yum 来直接安装 Kubernetes。再比如,1.4版本引入了 kubeadm 命令,将集群启动简化为两条命令,不需要再使用复杂的kube-up脚本。

Kubernetes 的官方文档更新的速度太快了,我们注意到在 Kubernetes 1.9 的文档Using kubeadm to Create a Cluster中已经给出了目前1.9的 kubeadm 的主要特性已经处于beta状态了,在2018年将进入GA状态,说明kubeadm离可以在生产环境中使用的距离越来越近了,这也是我们以后注意使用的安装方式,但是为了了解其中的安装过程,我们先从其他两种安装方式入手。
请查看博文:https://blog.51cto.com/wzlinux/2322616

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

二、主要组件说明

1、Master组件

Master组件提供集群的管理控制中心。

Master组件可以在集群中任何节点上运行。但是为了简单起见,通常在一台VM/机器上启动所有Master组件,并且不会在此VM/机器上运行用户容器

  • kube-apiserver
    kube-apiserver用于暴露Kubernetes API。任何的资源请求/调用操作都是通过kube-apiserver提供的接口进行。

  • etcd
    etcd是Kubernetes提供默认的存储系统,保存所有集群数据,使用时需要为etcd数据提供备份计划。

  • kube-controller-manager
    kube-controller-manager运行管理控制器,它们是集群中处理常规任务的后台线程。逻辑上,每个控制器是一个单独的进程,但为了降低复杂性,它们都被编译成单个二进制文件,并在单个进程中运行。

  • kube-scheduler
    kube-scheduler 监视新创建没有分配到Node的Pod,为Pod选择一个Node。

2、Node 组件

  • kubelet
    kubelet是主要的节点代理,它会监视已分配给节点的pod,具体功能:

    1. 安装Pod所需的volume。
    2. 下载Pod的Secrets。
    3. Pod中运行的 docker(或experimentally,rkt)容器。
    4. 定期执行容器健康检查。
    5. Reports the status of the pod back to the rest of the system, by creating a mirror pod if necessary.
    6. Reports the status of the node back to the rest of the system.
  • kube-proxy
    kube-proxy通过在主机上维护网络规则并执行连接转发来实现Kubernetes服务抽象。

  • docker
    docker用于运行容器。

  • flannel
    Flannel 是 CoreOS 团队针对 Kubernetes 设计的一个覆盖网络(Overlay Network)工具,需要另外下载部署。我们知道当我们启动 Docker 后会有一个用于和容器进行交互的 IP 地址,如果不去管理的话可能这个 IP 地址在各个机器上是一样的,并且仅限于在本机上进行通信,无法访问到其他机器上的 Docker 容器。Flannel 的目的就是为集群中的所有节点重新规划 IP 地址的使用规则,从而使得不同节点上的容器能够获得同属一个内网且不重复的 IP 地址,并让属于不同节点上的容器能够直接通过内网 IP 通信。

三、环境准备

1、节点准备

IP角色主要组件
172.18.8.200master:kubernetes-masterkube-apiserver,kube-apiserver,kube-controller-manager,kube-scheduler,kubelet,etcd
172.18.8.201node01:kubernetes-nodedocker,kubelet,kube-proxy,flannel
172.18.8.202node02:kubernetes-nodedocker,kubelet,kube-proxy,flannel

节点及网络规划图如下:

2、现在仓库中的版本

软件版本
kubernetes-master1.5.2-0.7.git269f928.el7
kubernetes-node1.5.2-0.7.git269f928.el7
CentOS 7.5CentOS Linux release 7.5.1804
Dockerdocker-1.13.1-75
etcd3.2.22-1.el7
flannel0.7.1-4.el7

3、环境准备

修改文件/etc/hostname
编辑文件/etc/hosts,增加如下内容,

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

关闭防火墙。

systemctl stop firewalld.servicesystemctl disable firewalld.service

关闭SELinux。

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

关闭swap。

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

四、安装 master 节点

1、软件安装

安装需要的软件。

yum install kubernetes-master etcd -y

修改共用的配置文件/etc/kubernetes/config,修改master节点,因为我们都在一台机器上面,不修改也可以。

#### kubernetes system config## The following values are used to configure various aspects of all# kubernetes services, including##   kube-apiserver.service#   kube-controller-manager.service#   kube-scheduler.service#   kubelet.service#   kube-proxy.service# logging to stderr means we get it in the systemd journalKUBE_LOGTOSTDERR="--logtostderr=true"# journal message level, 0 is debugKUBE_LOG_LEVEL="--v=0"# Should this cluster be allowed to run privileged docker containersKUBE_ALLOW_PRIV="--allow-privileged=false"# How the controller-manager, scheduler, and proxy find the apiserverKUBE_MASTER="--master=http://172.18.8.200:8080"

2、配置 etcd

因为我们很多服务使用到etcd,所以我们首先配置etcd服务。
在master节点上编辑文件/etc/etcd/etcd.conf,修改为如下内容,主要是修改监听IP:

[root@master ~]# cat /etc/etcd/etcd.conf#[Member]#ETCD_CORS=""ETCD_DATA_DIR="/var/lib/etcd/default.etcd"#ETCD_WAL_DIR=""#ETCD_LISTEN_PEER_URLS="http://localhost:2380"ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"#ETCD_MAX_SNAPSHOTS="5"#ETCD_MAX_WALS="5"ETCD_NAME="default"#ETCD_SNAPSHOT_COUNT="100000"#ETCD_HEARTBEAT_INTERVAL="100"#ETCD_ELECTION_TIMEOUT="1000"#ETCD_QUOTA_BACKEND_BYTES="0"#ETCD_MAX_REQUEST_BYTES="1572864"#ETCD_GRPC_KEEPALIVE_MIN_TIME="5s"#ETCD_GRPC_KEEPALIVE_INTERVAL="2h0m0s"#ETCD_GRPC_KEEPALIVE_TIMEOUT="20s"##[Clustering]#ETCD_INITIAL_ADVERTISE_PEER_URLS="http://localhost:2380"ETCD_ADVERTISE_CLIENT_URLS="http://0.0.0.0:2379"#ETCD_DISCOVERY=""#ETCD_DISCOVERY_FALLBACK="proxy"#ETCD_DISCOVERY_PROXY=""#ETCD_DISCOVERY_SRV=""#ETCD_INITIAL_CLUSTER="default=http://localhost:2380"#ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"#ETCD_INITIAL_CLUSTER_STATE="new"#ETCD_STRICT_RECONFIG_CHECK="true"#ETCD_ENABLE_V2="true"##[Proxy]#ETCD_PROXY="off"#ETCD_PROXY_FAILURE_WAIT="5000"#ETCD_PROXY_REFRESH_INTERVAL="30000"#ETCD_PROXY_DIAL_TIMEOUT="1000"#ETCD_PROXY_WRITE_TIMEOUT="5000"#ETCD_PROXY_READ_TIMEOUT="0"##[Security]#ETCD_CERT_FILE=""#ETCD_KEY_FILE=""#ETCD_CLIENT_CERT_AUTH="false"#ETCD_TRUSTED_CA_FILE=""#ETCD_AUTO_TLS="false"#ETCD_PEER_CERT_FILE=""#ETCD_PEER_KEY_FILE=""#ETCD_PEER_CLIENT_CERT_AUTH="false"#ETCD_PEER_TRUSTED_CA_FILE=""#ETCD_PEER_AUTO_TLS="false"##[Logging]#ETCD_DEBUG="false"#ETCD_LOG_PACKAGE_LEVELS=""#ETCD_LOG_OUTPUT="default"##[Unsafe]#ETCD_FORCE_NEW_CLUSTER="false"##[Version]#ETCD_VERSION="false"#ETCD_AUTO_COMPACTION_RETENTION="0"##[Profiling]#ETCD_ENABLE_PPROF="false"#ETCD_METRICS="basic"##[Auth]#ETCD_AUTH_TOKEN="simple"

启动服务。

systemctl start etcdsystemctl enable etcd

查看启动状态。

[root@master ~]# netstat -tlnp|grep etcdtcp        0      0 127.0.0.1:2380          0.0.0.0:*               LISTEN      1506/etcd           tcp6       0      0 :::2379                 :::*                    LISTEN      1506/etcd       

若要部署多节点集群也比较简单,参见 https://github.com/etcd-io/etcd/blob/master/Documentation/op-guide/clustering.md
[cluster]
ETCD_INITIAL_ADVERTISE_PEER_URLS:该成员节点在整个集群中的通信地址列表,这个地址用来传输集群数据的地址。因此这个地址必须是可以连接集群中所有的成员的。
ETCD_INITIAL_CLUSTER:配置集群内部所有成员地址。

3、配置 apiserver 服务

编辑文件/etc/kubernetes/apiserver,修改为如下,注意KUBE_ADMISSION_CONTROL参数:

[root@master ~]# cat /etc/kubernetes/apiserver#### kubernetes system config## The following values are used to configure the kube-apiserver## The address on the local server to listen to.#KUBE_API_ADDRESS="--insecure-bind-address=127.0.0.1"KUBE_API_ADDRESS="--address=0.0.0.0"# The port on the local server to listen on.KUBE_API_PORT="--port=8080"# Port minions listen onKUBELET_PORT="--kubelet-port=10250"# Comma separated list of nodes in the etcd clusterKUBE_ETCD_SERVERS="--etcd-servers=http://172.18.8.200:2379"# Address range to use for servicesKUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"# default admission control policies#KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota"KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,ResourceQuota"# Add your own!KUBE_API_ARGS=""

配置/etc/kubernetes/controller-manager/etc/kubernetes/scheduler暂时不做修改,启动服务。

systemctl start kube-apiserversystemctl start kube-controller-managersystemctl start kube-schedulersystemctl enable kube-apiserversystemctl enable kube-controller-managersystemctl enable kube-scheduler

查看各服务的启动状态。

[root@master ~]# netstat -tlnp|grep kube-apiservertcp6       0      0 :::6443                 :::*                    LISTEN      1622/kube-apiserver tcp6       0      0 :::8080                 :::*                    LISTEN      1622/kube-apiserver [root@master ~]# netstat -tlnp|grep kube-schedulertcp6       0      0 :::10251                :::*                    LISTEN      1646/kube-scheduler 

五、配置node节点

1、安装需要的软件

yum install kubernetes-node flannel docker -y

给docker配置国内加速器。

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

所有node节点编辑配置文件/etc/kubernetes/config,修改为如下内容:

#### kubernetes system config## The following values are used to configure various aspects of all# kubernetes services, including##   kube-apiserver.service#   kube-controller-manager.service#   kube-scheduler.service#   kubelet.service#   kube-proxy.service# logging to stderr means we get it in the systemd journalKUBE_LOGTOSTDERR="--logtostderr=true"# journal message level, 0 is debugKUBE_LOG_LEVEL="--v=0"# Should this cluster be allowed to run privileged docker containersKUBE_ALLOW_PRIV="--allow-privileged=false"# How the controller-manager, scheduler, and proxy find the apiserverKUBE_MASTER="--master=http://172.18.8.200:8080"

2、配置 kubelet 服务

编辑文件/etc/kubernetes/kubelet,修改内容如下:

#### kubernetes kubelet (minion) config# The address for the info server to serve on (set to 0.0.0.0 or "" for all interfaces)KUBELET_ADDRESS="--address=0.0.0.0"# The port for the info server to serve on#KUBELET_PORT="--port=10250"# You may leave this blank to use the actual hostname#KUBELET_HOSTNAME="--hostname-override=172.18.8.201"# location of the api-serverKUBELET_API_SERVER="--api-servers=http://172.18.8.200:8080"# pod infrastructure container#KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"# Add your own!KUBELET_ARGS=""

启动服务。

systemctl start kubeletsystemctl start kube-proxysystemctl enable kubeletsystemctl enable kube-proxy

3、配置 flannel 网络

编辑所有node节点/etc/sysconfig/flanneld,修改内容如下:

[root@node01 ~]# cat /etc/sysconfig/flanneld# Flanneld configuration options  # etcd url location.  Point this to the server where etcd runsFLANNEL_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="/atomic.io/network"# Any additional options that you want to pass#FLANNEL_OPTIONS=""

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

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

在各node节点上启动 flannel。

systemctl start flanneldsystemctl enable flanneld

4、启动 docker 服务

因为要让pod使用flannel创建的网络,所以docker的启动要在flannel后面。

systemctl restart dockersystemctl enable docker

六、检查验收

在master查看各node节点情况。

[root@master ~]# kubectl get nodesNAME                 STATUS    AGEnode01.wzlinux.com   Ready     12mnode02.wzlinux.com   Ready     10m

创建pod。

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

发现容器一直在创建。

[root@master ~]# kubectl get pods -o wideNAME                    READY     STATUS              RESTARTS   AGE       IP        NODEnginx-701339712-099j9   0/1       ContainerCreating   0          3m            node01.wzlinux.comnginx-701339712-vw0zh   0/1       ContainerCreating   0          3m            node02.wzlinux.comnginx-701339712-wqjq1   0/1       ContainerCreating   0          3m            node02.wzlinux.com

这种情况,我们可以使用kubectl describe pod POD_NAME查看Pod因为什么原因一直卡主。

因为网络的原因,这个地方我们访问不到,不过我们可以间接的获取这个镜像,那我们通过阿里云上面的镜像来替代,在所以node节点执行下面的命令。

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

稍等片刻,我们在查看pod状态,发现已经OK,如果还有问题,可以继续进入容器查看日志。

[root@master ~]# kubectl get pods -o wideNAME                    READY     STATUS    RESTARTS   AGE       IP            NODEnginx-701339712-099j9   1/1       Running   0          11m       10.244.32.2   node01.wzlinux.comnginx-701339712-vw0zh   1/1       Running   0          11m       10.244.53.3   node02.wzlinux.comnginx-701339712-wqjq1   1/1       Running   0          11m       10.244.53.2   node02.wzlinux.com

但是还有问题,这是因为iptables的FORWARD是默认禁止的,禁用了iptables filter表中FOWARD链,这样会引起Kubernetes集群中跨Node的Pod无法通信。

我们这里手动在所有node节点上面放行。

iptables -P FORWARD ACCEPT

附录:版本更加新的yum仓库

目前自带的 yum 源的软件版本都比较低,也可以更改仓库,使用稍微较高的一个版本,目前该仓库的版本为1.10。
http://cbs.centos.org/repos/virt7-kubernetes-110-release/x86_64/os/Packages/

cat < /etc/yum.repos.d/kubernetes.repo[kubernetes]name=Kubernetesbaseurl=http://cbs.centos.org/repos/virt7-kubernetes-110-release/x86_64/os/enabled=1gpgcheck=0EOF

其他的配置操作照旧,如果感觉下载速度慢,可以提前把rpm包下载下来,安装配置好查看版本。

[root@master ~]# kubectl versionClient Version: version.Info{Major:"1", Minor:"10", GitVersion:"v1.10.3", GitCommit:"2bba0127d85d5a46ab4b778548be28623b32d0b0", GitTreeState:"archive", BuildDate:"2018-06-05T13:37:07Z", GoVersion:"go1.9.4", Compiler:"gc", Platform:"linux/amd64"}Server Version: version.Info{Major:"1", Minor:"10", GitVersion:"v1.10.3", GitCommit:"2bba0127d85d5a46ab4b778548be28623b32d0b0", GitTreeState:"archive", BuildDate:"2018-06-05T13:37:07Z", GoVersion:"go1.9.4", Compiler:"gc", Platform:"linux/amd64"}

注意:新的版本部分配置文件有些不一样,配置的时候请注意。

到此,使用yum仓库安装的版本已经完成。

0