zoukankan      html  css  js  c++  java
  • CentOS 7.5 使用 yum 安装 Kubernetes 集群(二)

    一、安装方式介绍

    1、yum 安装

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

    2、二进制安装

    使用二进制文件安装,好处是可以安装任意版本的 Kubernetes,坏处是配置比较复杂,很多软件包因为一些原因,我们在大陆是访问不到的。
    请查看博文:http://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离可以在生产环境中使用的距离越来越近了,这也是我们以后注意使用的安装方式,但是为了了解其中的安装过程,我们先从其他两种安装方式入手。
    请查看博文:http://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.200 master:kubernetes-master kube-apiserver,kube-apiserver,kube-controller-manager,kube-scheduler,kubelet,etcd
    172.18.8.201 node01:kubernetes-node docker,kubelet,kube-proxy,flannel
    172.18.8.202 node02:kubernetes-node docker,kubelet,kube-proxy,flannel

    节点及网络规划图如下:

    2、现在仓库中的版本

    软件 版本
    kubernetes-master 1.5.2-0.7.git269f928.el7
    kubernetes-node 1.5.2-0.7.git269f928.el7
    CentOS 7.5 CentOS Linux release 7.5.1804
    Docker docker-1.13.1-75
    etcd 3.2.22-1.el7
    flannel 0.7.1-4.el7

    3、环境准备

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

    172.18.8.200 master.wzlinux.com master
    172.18.8.201 node01.wzlinux.com node01
    172.18.8.202 node02.wzlinux.com node02
    

    关闭防火墙。

    systemctl stop firewalld.service
    systemctl disable firewalld.service
    

    关闭SELinux。

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

    关闭swap。

    swapoff -a
    sed -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 journal
    KUBE_LOGTOSTDERR="--logtostderr=true"
    
    # journal message level, 0 is debug
    KUBE_LOG_LEVEL="--v=0"
    
    # Should this cluster be allowed to run privileged docker containers
    KUBE_ALLOW_PRIV="--allow-privileged=false"
    
    # How the controller-manager, scheduler, and proxy find the apiserver
    KUBE_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 etcd
    systemctl enable etcd
    

    查看启动状态。

    [root@master ~]# netstat -tlnp|grep etcd
    tcp        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 on
    KUBELET_PORT="--kubelet-port=10250"
    
    # Comma separated list of nodes in the etcd cluster
    KUBE_ETCD_SERVERS="--etcd-servers=http://172.18.8.200:2379"
    
    # Address range to use for services
    KUBE_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-apiserver
    systemctl start kube-controller-manager
    systemctl start kube-scheduler
    systemctl enable kube-apiserver
    systemctl enable kube-controller-manager
    systemctl enable kube-scheduler
    

    查看各服务的启动状态。

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

    五、配置node节点

    1、安装需要的软件

    yum install kubernetes-node flannel docker -y
    

    给docker配置国内加速器。

    sudo mkdir -p /etc/docker
    sudo tee /etc/docker/daemon.json <<-'EOF'
    {
      "registry-mirrors": ["https://hdi5v8p1.mirror.aliyuncs.com"]
    }
    EOF
    sudo 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 journal
    KUBE_LOGTOSTDERR="--logtostderr=true"
    
    # journal message level, 0 is debug
    KUBE_LOG_LEVEL="--v=0"
    
    # Should this cluster be allowed to run privileged docker containers
    KUBE_ALLOW_PRIV="--allow-privileged=false"
    
    # How the controller-manager, scheduler, and proxy find the apiserver
    KUBE_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-server
    KUBELET_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 kubelet
    systemctl start kube-proxy
    systemctl enable kubelet
    systemctl 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 runs
    FLANNEL_ETCD_ENDPOINTS="http://172.18.8.200:2379"
    
    # etcd config key.  This is the configuration key that flannel queries
    # For address range assignment
    FLANNEL_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 flanneld
    systemctl enable flanneld
    

    4、启动 docker 服务

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

    systemctl restart docker
    systemctl enable docker
    

    六、检查验收

    在master查看各node节点情况。

    [root@master ~]# kubectl get nodes
    NAME                 STATUS    AGE
    node01.wzlinux.com   Ready     12m
    node02.wzlinux.com   Ready     10m
    

    创建pod。

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

    发现容器一直在创建。

    [root@master ~]# kubectl get pods -o wide
    NAME                    READY     STATUS              RESTARTS   AGE       IP        NODE
    nginx-701339712-099j9   0/1       ContainerCreating   0          3m        <none>    node01.wzlinux.com
    nginx-701339712-vw0zh   0/1       ContainerCreating   0          3m        <none>    node02.wzlinux.com
    nginx-701339712-wqjq1   0/1       ContainerCreating   0          3m        <none>    node02.wzlinux.com
    

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

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

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

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

    [root@master ~]# kubectl get pods -o wide
    NAME                    READY     STATUS    RESTARTS   AGE       IP            NODE
    nginx-701339712-099j9   1/1       Running   0          11m       10.244.32.2   node01.wzlinux.com
    nginx-701339712-vw0zh   1/1       Running   0          11m       10.244.53.3   node02.wzlinux.com
    nginx-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 <<EOF > /etc/yum.repos.d/kubernetes.repo
    [kubernetes]
    name=Kubernetes
    baseurl=http://cbs.centos.org/repos/virt7-kubernetes-110-release/x86_64/os/
    enabled=1
    gpgcheck=0
    EOF
    

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

    [root@master ~]# kubectl version
    Client 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仓库安装的版本已经完成。

  • 相关阅读:
    tar命令,vi编辑器
    Linux命令、权限
    Color Transfer between Images code实现
    利用Eclipse使用Java OpenCV(Using OpenCV Java with Eclipse)
    Matrix Factorization SVD 矩阵分解
    ZOJ Problem Set
    Machine Learning
    ZOJ Problem Set
    ZOJ Problem Set
    ZOJ Problem Set
  • 原文地址:https://www.cnblogs.com/wzlinux/p/10159278.html
Copyright © 2011-2022 走看看