美文网首页运维相关DevOpsKubernetes
搭建kubernetes集群及kubernetes集群的应用

搭建kubernetes集群及kubernetes集群的应用

作者: 任总 | 来源:发表于2019-02-21 00:54 被阅读1次
    • 本文使用kubernetes版本较老,初次实验简单部署,不足之处较多,欢迎交流。

    一、容器编排软件

    1、docker编排三剑客:联合使用

    docker-machine 管理主机容器
    docker-swarm 跨主机,监控容器
    docker-compose 编排主机容器

    2、ASF旗下的mesos资源调度框架,依赖于marathon编排容器

    3、 Google旗下的kubernetes,核心思想是一切皆容器,容器调度框架是Borg

    • Kubernetes是Google开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。在生产环境中部署一个应用程序时,通常要部署该应用的多个实例以便对应用请求进行负载均衡。
    • 在Kubernetes中,我们可以创建多个容器,每个容器里面运行一个应用实例,然后通过内置的负载均衡策略,实现对这一组应用实例的管理、发现、访问,而这些细节都不需要运维人员去进行复杂的手工配置和处理。
    Kubernetes 特点
    • 可移植: 支持公有云,私有云,混合云,多重云(multi-cloud)

    • 可扩展: 模块化, 插件化, 可挂载, 可组合

    • 自动化: 自动部署,自动重启,自动复制,自动伸缩/扩展

    • kubernetes代码托管站点:https://github.com/kubernetes
      官方网站:https://kubernetes.io/

    二、Kubernetes组件

    物理组件master和node
    物理组件

    1、Master 组件

    ETCD
    kube-controller-manager
    cloud-controller-manager
    kube-scheduler
    插件 addons
    DNS
    用户界面
    容器资源监测
    Cluster-level Logging

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

    (1)、kube-apiserver

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

    (2)、 ETCD

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

    (3)、kube-controller-manager

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

    这些控制器包括:

    • 节点(Node)控制器。

    • 副本(Replication)控制器:负责维护系统中每个副本中的pod。

    • 端点(Endpoints)控制器:填充Endpoints对象(即连接Services&Pods)。

    • Service Account和Token控制器:为新的Namespace创建默认帐户访问API Token。

    (4)、cloud-controller-manager

    • 云控制器管理器负责与底层云提供商的平台交互。云控制器管理器是Kubernetes版本1.6中引入的,目前还是Alpha的功能。
    • 云控制器管理器仅运行云提供商特定的(controller loops)控制器循环。可以通过将--cloud-providerflag设置为external启动kube-controller-manager ,来禁用控制器循环。

    cloud-controller-manager 具体功能:

    • 节点(Node)控制器

    • 路由(Route)控制器

    • Service控制器

    • 卷(Volume)控制器

    (5)、kube-scheduler

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

    (6)插件 addons

    • 插件(addon)是实现集群pod和Services功能的。Pod由Deployments,ReplicationController等进行管理。Namespace 插件对象是在kube-system Namespace中创建。

    (7)DNS

    • 虽然不严格要求使用插件,但Kubernetes集群都应该具有集群 DNS。

    • 群集 DNS是一个DNS服务器,能够为 Kubernetes services提供 DNS记录。

    • 由Kubernetes启动的容器自动将这个DNS服务器包含在他们的DNS searches中。

    (8)用户界面

    • kube-ui提供集群状态基础信息查看和容器资源监测

    • 容器资源监控提供一个UI浏览监控数据。

    (9)Cluster-level Logging

    • Cluster-level logging,负责保存容器日志,搜索/查看日志。

    2、节点(Node)组件

    kubelet
    kube-proxy
    docker
    RKT
    supervisord
    fluentd

    • 节点组件运行在Node,提供Kubernetes运行时环境,以及维护Pod。

    (1)、kubelet

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

    • 安装Pod所需的volume。

    • 下载Pod的Secrets。

    • Pod中运行的 docker(或experimentally,rkt)容器。

    • 定期执行容器健康检查,报告节点状态。

    (2)、kube-proxy

    • kube-proxy通过在主机上维护网络规则并执行连接转发来实现Kubernetes服务抽象。

    (3)、docker

    • docker用于运行容器。

    (4)、RKT

    • rkt运行容器,作为docker工具的替代方案。

    (5)、supervisord

    • supervisord是一个轻量级的监控系统,用于保障kubelet和docker运行。

    (6)fluentd

    • fluentd是一个守护进程,可提供cluster-level logging.。
    核心组件
    node节点内部组件
    Pod内部的容器

    3、Node节点的内部组件

    • Pod:一群容器组成
    • Labels:标签识别Pod组,每创建一个Pod就会打一个Labels标签
    • Service:选择器通过Labels选择出一组功能相同的pod加ip,组成一个service
    • Kubelet :容器代理
    • kube-proxy :kube代理,负载均衡器
    • etcd:数据存储服务
    • cAdvisor :统计代理程序,收集容器资源使用性能统计数据
    • Replication Controller:管理复制pod组
    • Scheduler:在工作节点内调度pod组
    • APIServer: Kubernetes API服务器

    4、Pod

    Pod内部容器通信,存储
    • 同pod内的容器互相通信使用IPC(节点间通信);
    • 容器可以找到对方的本地主机;
    • 每个容器名字来自pod组名
    • 每个pod都有一个IP地址在一个层面共享网络空间
    • 在pod内的容器中共享一个存储卷
    Pod实现
    Label标签
    services实现

    5、Services

    • Kubernetes的Service定义了这样一种抽象:逻辑上的一组 Pod,一种可以访问它们的策略 —— 通常称为微服务。 这一组 Pod能够被 Service访问到,通常是通过 Label Selector(标签选择器)实现的。
    • 对 Kubernetes 集群中的应用,Kubernetes 提供了简单的 Endpoints API,只要Service 中的一组 Pod发生变更,应用程序就会被更新。 对非 Kubernetes 集群中的应用,Kubernetes 提供了基于 VIP 的网桥的方式访问Service,再由 Service 重定向到备用的 Pod。
    • Services可以暴露出集群内部或外部,成为一个静态API对象,配静态IP进行使用。

    6、Discovering services服务发现

    第一种:Environment variables环境变量
    第二种:DNS

    • DNS插件:1.3版本,dns实现叫做skydns,以后叫kube-dns
    • Kubernetes 从 1.3 版本起, DNS 是内置的服务,通过插件管理器 集群插件 自动被启动。
    • Kubernetes DNS 在集群中调度 DNS Pod 和 Service ,配置 kubelet 以通知个别容器使用 DNS Service 的 IP 解析 DNS 名字。

    7、kubernetes的网络

    • kubernetes的集群节点间通信使用overlay network叠加网络实现。
    • 叠加网络的实现软件有:flannel、calico、contiv等,其中flannel较为成熟可靠。

    三、kubernetes集群快速部署

    • 环境:
      master, etcd:192.168.1.61
      node1:192.168.1.62
      node2:192.168.1.63
      前提:
      1、基于主机名通信:/etc/hosts;
      2、时间同步;
      3、关闭firewalld和iptables.service;

    OS:CentOS 7.3.1611, Extras仓库中;

    安装配置步骤:

    1、etcd,仅master节点;
    2、flannel,集群的所有节点;
    3、配置k8s的master:仅master节点;
    kubernetes-master
    启动的服务:
    kube-apiserver, kube-scheduler, kube-controller-manager
    4、配置k8s的各Node节点;
    kubernetes-node
    先设定启动docker服务;
    启动的k8s的服务:
    kube-proxy, kubelet

    1、部署kubernetes的master节点

    设置解析hosts文件
    [root@node-61 ~]# vim /etc/hosts
    
    127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
    ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
    192.168.1.61  master.localhost.localdomain master etcd1 registry
    192.168.1.62  node1.localhost.localdomain node1
    192.168.1.63  node2.localhost.localdomain node2
    
    为了方便节点间的通信,使用ssh
    [root@node-61 ~]# ssh-keygen -t rsa -P ''
    
    [root@node-61 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@node1
    
    [root@node-61 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@node2
    
    
    同步hosts文件
    [root@node-61 ~]# scp /etc/hosts node1:/etc/
    hosts                                                                                                 100%  321     9.8KB/s   00:00    
    [root@node-61 ~]# scp /etc/hosts node2:/etc/
    hosts                          
    
    查看yum中有无extras仓库
    [root@node-61 ~]# yum repolist
    ...........
    !extras/7/x86_64 
    
    部署etcd

    etcd是开源的分布式键值存储,同时支持服务发现,支持leader选举,由go语言研发,访问接口是HTTP+JSON的API。
    开发或实验环境部署etcd,单节点即可


    开发或实验环境部署etcd

    生产环境部署etcd,多节点集群部署,一般为奇数3、5、7、9个。


    生产环境部署etcd
    安装etcd
    [root@node-61 ~]# yum install etcd -y
    

    监听两个端口2379和2380

    编辑etcd配置文件
    [root@master ~]# vim /etc/etcd/etcd.conf
    #[Member]成员配置
    ETCD_DATA_DIR="/var/lib/etcd/default.etcd"      #存储目录
    ETCD_LISTEN_PEER_URLS="http://192.168.1.61:2380"      #监听集群地址端口
    ETCD_LISTEN_CLIENT_URLS="http://192.168.1.61:2379"    #监听客户端地址端口
    ETCD_NAME="default"   #名称
    
    #[Clustering]集群配置
    ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.1.61:2380"     #集群通告地址端口
    ETCD_ADVERTISE_CLIENT_URLS="http://192.168.1.61:2379"    #集群客户端口
    ETCD_INITIAL_CLUSTER="default=http://192.168.1.61:2380"       #集群成员,如果有多个成员在http中间用,隔离,default要保持与name一致。
    
    
    • name:节点名称
    • data-dir:指定节点的数据存储目录
    • listen-peer-urls: 监听URL,用于与其他节点通讯
    • listen-client-urls :对外提供服务的地址:比如 http://ip:2379,http://127.0.0.1:2379 ,客户端会连接到这里和 etcd 交互
    • initial-advertise-peer-urls:该节点同伴监听地址,这个值会告诉集群中其他节点
    • initial-cluster :集群中所有节点的信息,格式为 node1=http://ip1:2380,node2=http://ip2:2380,… >。注意:这里的 node1 是节点的 --name 指定的名字;后面的 ip1:2380 是 --initial-advertise-peer-urls 指定的值
    • initial-cluster-state:新建集群的时候,这个值为 new ;假如已经存在的集群,这个值为 existing
    • initial-cluster-token : 创建集群的 token,这个值每个集群保持唯一。这样的话,如果你要重新创建集群,即使配置和之前一样,也会再次生成新的集群和节点 uuid;否则会导致多个集群之间的冲突,造成未知的错误
    • advertise-client-urls: 对外公告的该节点客户端监听地址,这个值会告诉集群中其他节点
    启动etcd
    [root@master ~]# systemctl start etcd
    [root@master ~]# ss -tnl
    State      Recv-Q Send-Q                                                                   Local Address:Port                                                                                  Peer Address:Port              
    LISTEN     0      128                                                                       192.168.1.61:2379                                                                                             *:*                  
    LISTEN     0      128                                                                       192.168.1.61:2380                                                                                             *:*    
    
    集群检查
    #集群信息
    [root@master ~]# etcdctl -C http://master:2379 member list
    8e9e05c52164694d: name=default peerURLs=http://localhost:2380 clientURLs=http://192.168.1.61:2379 isLeader=true
    
    #集群健康状态
    [root@master ~]# etcdctl -C http://master:2379 cluster-health
    member 8e9e05c52164694d is healthy: got healthy result from http://192.168.1.61:2379
    
    
    etcd键值存储使用
    #创建目录
    [root@master ~]# etcdctl -C http://master:2379 mkdir test
    [root@master ~]# etcdctl -C http://master:2379 mkdir ls
    
    #查询目录
    [root@master ~]# etcdctl -C http://master:2379 ls
    /test
    /ls
    
    #删除空目录
    [root@master ~]# etcdctl -C http://master:2379 rmdir ls
    [root@master ~]# etcdctl -C http://master:2379 ls
    /test
    
    #创建键值
    [root@master ~]# etcdctl -C http://master:2379 mk /test/newkey hello
    hello
    
    #获取键值
    [root@master ~]# etcdctl -C http://master:2379 get  /test/newkey 
    hello
    
    #修改键值
    [root@master ~]# etcdctl -C http://master:2379 set  /test/newkey hello-world
    hello-world
    
    #删除非空目录
    [root@master ~]# etcdctl -C http://master:2379  rm -r /test
    
    
    安装kubernetes-master
    [root@master ~]# yum install kubernetes-master -y
    
    
    配置
    [root@master ~]# vim /etc/kubernetes/apiserver
    #非安全http协议的监听地址
    KUBE_API_ADDRESS="--insecure-bind-address=192.168.1.61"
    #监听端口
    # KUBE_API_PORT="--port=8080"
    #kubelet监听端口
    # KUBELET_PORT="--kubelet-port=10250"
    #集群成员,中间用逗号隔开
    KUBE_ETCD_SERVERS="--etcd-servers=http://192.168.1.61:2379"
    #k8s内部服务的地址网段
    KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"
    #默认的控制:名称空间生命周期、名称空间存在、资源限制、安全上下文限制、资源配额
    policiesKUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"
    #自定义选项
    KUBE_API_ARGS=""
    
    [root@master ~]# vim /etc/kubernetes/config 
    #标准日志输出
    KUBE_LOGTOSTDERR="--logtostderr=true"
    #日志记录级别
    KUBE_LOG_LEVEL="--v=0"
    #是否允许某个节点运行特权容器
    KUBE_ALLOW_PRIV="--allow-privileged=false"
    #master地址
    KUBE_MASTER="--master=http://192.168.1.61:8080"
    ~                                                        
    
    启动kubernetes
    #启动三个服务
    [root@master ~]# systemctl start kube-apiserver.service kube-controller-manager.service kube-scheduler.service
    [root@master ~]# ss -tnl
    State      Recv-Q Send-Q Local Address:Port               Peer Address:Port              
    LISTEN     0      128    192.168.1.61:2379                      *:*                  
    LISTEN     0      128    192.168.1.61:2380                      *:*                  
    LISTEN     0      128    192.168.1.61:8080                      *:*                  
    LISTEN     0      128           *:22                        *:*                  
    LISTEN     0      100    127.0.0.1:25                        *:*                  
    LISTEN     0      128          :::6443                     :::*                  
    LISTEN     0      128          :::10251                    :::*                  
    LISTEN     0      128          :::10252                    :::*     
    
    建立docker私有镜像仓库
    [root@master ~]# yum install docker-distribution -y
    [root@master ~]# systemctl start docker-distribution.service
    
    [root@master ~]# ss -tnl
    
    LISTEN     0      128          :::5000                     :::*  
    

    2、node节点的安装

    • 两个node节点操作,同步时间,关闭防火墙,修改hosts文件。
    #安装docker
    [root@node-62 ~]# yum install docker -y
    
    #配置私有仓库
    [root@node-62 ~]# vim /etc/docker/daemon.json 
    { "insecure-registries":["192.168.1.61:5000"] }
    
    #启动docker
    [root@node-62 ~]# systemctl start docker
    
    
    下载镜像,并上传到私有仓库
    #从公有仓储下载centos
    [root@node-62 ~]# docker pull centos:latest
    
    #修改标签
    [root@node-62 ~]# docker tag docker.io/centos:latest 192.168.1.61:5000/centos:latest
    
    #上传到私有仓库
    [root@node-62 ~]# docker push 192.168.1.61:5000/centos:latest
    
    
    两个节点安装kubernetes的node
    [root@node-63 ~]# yum install kubernetes-node -y
    
    配置文件
    [root@node-62 ~]# vim /etc/kubernetes/kubelet 
    #监听地址
    KUBELET_ADDRESS="--address=0.0.0.0"
    
    #监听端口
    # KUBELET_PORT="--port=10250"
    
    #使用的主机名称,如果引号内部为空,则使用默认系统主机名
    KUBELET_HOSTNAME="--hostname-override=node1"
    
    #指明master主机地址
    KUBELET_API_SERVER="--api-servers=http://master:8080"
    
    #基础架构容器地址
    KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"
    
    #自定义选项
    KUBELET_ARGS=""
    
    #全局配置文件
    [root@node-62 ~]# vim /etc/kubernetes/config
    ........
    KUBE_MASTER="--master=http://master:8080"   #指明master主机地址端口
    
    
    #node1配置文件同步到node2上
    [root@node-62 ~]# scp /etc/kubernetes/*  node2:/etc/kubernetes/
    
    
    启动kubernetes-node
    [root@node-62 ~]# systemctl start kubelet.service kube-proxy.service
    [root@node-62 ~]# ss -tnl
    State      Recv-Q Send-Q Local Address:Port               Peer Address:Port              
    LISTEN     0      128    127.0.0.1:10248                     *:*                  
    LISTEN     0      128    127.0.0.1:10249                     *:*                  
    LISTEN     0      128           *:22                        *:*                  
    LISTEN     0      100    127.0.0.1:25                        *:*                  
    LISTEN     0      128          :::10250                    :::*                  
    LISTEN     0      128          :::10255                    :::*                  
    LISTEN     0      128          :::22                       :::*                  
    LISTEN     0      100         ::1:25                       :::*                  
    LISTEN     0      128          :::4194                     :::* 
    

    3、master节点运行容器

    kubernetes的状态查询
    #查看api版本
    [root@master ~]# kubectl -s http://master:8080 api-versions
    apps/v1beta1
    authentication.k8s.io/v1beta1
    authorization.k8s.io/v1beta1
    autoscaling/v1
    batch/v1
    certificates.k8s.io/v1alpha1
    extensions/v1beta1
    policy/v1beta1
    rbac.authorization.k8s.io/v1alpha1
    storage.k8s.io/v1beta1
    v1
    
    #查看集群相关
    
    [root@master ~]# kubectl -s http://master:8080 cluster-info
    Kubernetes master is running at http://master:8080
    
    #获取详细信息
    [root@master ~]# kubectl -s http://master:8080 cluster-info dump
    
    #获取节点信息
    [root@master ~]# kubectl -s http://master:8080 get no
    NAME      STATUS    AGE
    node1     Ready     13h
    node2     Ready     13h
    
    #查询运行pod
    [root@master ~]# kubectl -s http://master:8080 get po
    
    运行容器

    格式:kubectl run NAME --image=image [--env="key=value"] [--port=port]
    [--replicas=replicas] [--dry-run=bool] [--overrides=inline-json] [--command] --
    [COMMAND] [args...] [options]

    name:名字
    image:镜像路径
    --port:暴露端口
    --replicas:启动几个副本
    --dry-run:测试运行
    --overrides:覆盖

    --command:改变启动默认命令

    #使用私有仓库创建pod
    [root@master ~]# kubectl -s http://master:8080 run centos7base --image=192.168.1.61:5000/centos:latest --replicas=2
    deployment "centos7base" created
    
    #查询
    [root@master ~]# kubectl -s http://master:8080 get deployments
    NAME          DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
    centos7base   2         2         2            0           29s
    
    #删除部署pod
    [root@master ~]# kubectl -s http://master:8080 delete deployment centos7base
    deployment "centos7base" deleted
    
    

    创建pod报错

    状态始终是 ContainerCreating,各个节点中也无创建容器
    [root@master ~]# kubectl -s http://master:8080 get pods
    NAME                    READY     STATUS              RESTARTS   AGE
    bbox-3908540199-t7khd   0/1       ContainerCreating   0          4m
    
    #查询日志
    
    [root@master ~]# kubectl -s http://master:8080 describe pod bbox-3908540199-t7khd
    .....................
    Error syncing pod, skipping: failed to "StartContainer" for "POD" with ErrImagePull: "image pull failed for registry.access.redhat.com/rhel7/pod-infrastructure:latest, this may be because there are no credentials on this request.  details: (open /etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt: no such file or directory)"
    
    #解决方法
    原因是node节点上:/etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt这个目录中是一个软连接,实际上并没有这个文件。
    
    #在两个node节点上下载
    [root@node-62 ~]#  wget http://mirror.centos.org/centos/7/os/x86_64/Packages/python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm
    
    #安装
    [root@node-62 ~]#  rpm2cpio python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm | cpio -iv --to-stdout ./etc/rhsm/ca/redhat-uep.pem | tee /etc/rhsm/ca/redhat-uep.pem
    
    
    

    4、配置flannel网络

    因为flannel的网络配置要保存在etcd中,所以master和两个node节点也要按装etcd

    [root@node-62 ~]# yum install etcd -y
    [root@node-62 ~]# yum install flannel -y
    
    
    修改配置文件
    [root@master ~]# vim /etc/sysconfig/flanneld 
    #etcd地址端口
    FLANNEL_ETCD_ENDPOINTS="http://etcd1:2379"
    #存储路径
    FLANNEL_ETCD_PREFIX="/ilinux.io/network"
    
    #给两个node节点同步配置
    [root@master ~]# scp /etc/sysconfig/flanneld node2:/etc/sysconfig/
    
    [root@master ~]# scp /etc/sysconfig/flanneld node1:/etc/sysconfig/
    
    #创建网络
    [root@master ~]# etcdctl -C http://etcd1:2379 mk /ilinux.io/network/config '{"Network":"10.7.0.0/16"}'
    {"Network":"10.7.0.0/16"}
    
    
    所有节点启动flanneld服务
    [root@master ~]# systemctl start flanneld.service
    
    #flannel自动创建一个隧道网桥
    
    [root@master ~]# ifconfig
    
    ................
    flannel0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1472
            inet 10.7.54.0  netmask 255.255.0.0  destination 10.7.54.0
            inet6 fe80::21d5:9d6a:a31a:d587  prefixlen 64  scopeid 0x20<link>
            unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 500  (U
    

    两个node节点重新启动docker服务,使docker自动获取flannel的地址

    
    [root@node-62 ~]# systemctl restart docker.service
    [root@node-62 ~]# ifconfig
    docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
            inet 10.7.9.1  netmask 255.255.255.0  broadcast 0.0.0.0
    
    

    两个node节点容器测试通信

    #node1节点容器
    #添加防火墙规则
    [root@node-62 ~]# iptables -A FORWARD -s 10.7.9.0/16 -j ACCEPT
    
    [root@node-62 ~]# docker run --name bbox1 --rm -it busybox:latest
    / # ifconfig
    eth0      Link encap:Ethernet  HWaddr 02:42:0A:07:09:02  
              inet addr:10.7.9.2  Bcast:0.0.0.0  Mask:255.255.255.0
    / # ping 10.7.90.2
    
    
    #node2节点容器
    #添加防火墙规则
    [root@node-63 ~]# iptables -A FORWARD -s 10.7.90.0/16 -j ACCEPT
    
    [root@node-63 ~]# docker run --name bbox1 --rm -it busybox:latest
    / # ifconfig
    eth0      Link encap:Ethernet  HWaddr 02:42:0A:07:5A:02  
              inet addr:10.7.90.2  Bcast:0.0.0.0  Mask:255.255.255.0
    / # ping 10.7.9.2
    

    四、kubernetes的对象

    1、运行容器遇到问题

    • (1)、定义在那个节点中运行那个pod,而pod中运行什么容器。
    • (2)、运行的容器化的应用程序,可以获得哪些资源。
    • (3)、定义运行的容器化的应用程序各种策略,例如重启、升级。

    kubernetes集群必须确保对象存在,目标状态,通过kubernetes server交互

    kubernetes对象有两种状态:
    • spec和status
      spec状态:目标期望状态
      status状态:当前状态
    • 在任何时间,kubernetes control plane要使每个对象处于目标状态,还要定义有几个副本。
    • 在集群中要创建对象时候,必须定义对象的目标状态的描述信息,放置在配置文件中,格式为JSON或yaml格式。

    2、容器编排配置文件

    各种类型对象及其相关属性文档:
    https://v1-9.docs.kubernetes.io/docs/reference/generated/kubernetes-api/v1.9

    apiversion:api版本
    kind:指明当前属于哪一种部署方式
    metadata:源数据配置段
    name:定义deployment引用名称
    spec:目标状态配置段
    replicas:启动pod的数量
    template:要创建的pod模板
    labels:标签
    app:nginx:键值对,键app、值nginx
    containers:容器,列出pod中的容器,至少应该一个,且不可被更新。

    • name:容器的名字,作为DNS_LBAEL使用,使用后被更新到内部DNS。
      image:docker镜像
    • 对象文件必须定义apiversion、kind、metadata配置
      使用
    kubectl create -f ./deployment-example.yaml --record
    

    启动pod常用格式

    Deployment对象格式
    DaemonSet对象格式 service对象格式

    ports:开放端口
    slector:挑选器pod,请求发往那个pod
    type :请求转发到pod类型,例如:clusterip、loadbalancer,nodeport,extername

    3、示例

    master节点启动服务
    [root@master ~]# systemctl start etcd.service
    [root@master ~]# systemctl start flanneld.service
    [root@master ~]# systemctl start docker-distribution.service
    [root@master ~]# systemctl start kube-apiserver.service kube-controller-manager.service kube-scheduler.service
    [root@master ~]# ss -tnl
    State       Recv-Q Send-Q Local Address:Port               Peer Address:Port              
    LISTEN      0      128    192.168.1.61:2379                      *:*                  
    LISTEN      0      128    192.168.1.61:2380                      *:*                  
    LISTEN      0      128    192.168.1.61:8080                      *:*                  
    LISTEN      0      128           *:22                        *:*                  
    LISTEN      0      100    127.0.0.1:25                        *:*                  
    LISTEN      0      128          :::5000                     :::*                  
    LISTEN      0      128          :::6443                     :::*                  
    LISTEN      0      128          :::10251                    :::*                  
    LISTEN      0      128          :::10252                    :::*                  
    LISTEN      0      128          :::22                       :::*                  
    LISTEN      0      100         ::1:25   
    
    node1和node2节点启动服务
    #避免docker下载https报错,添加
    [root@master ~]# vim /etc/docker/daemon.json 
    { "insecure-registries":["192.168.1.61:5000"] }
    
    #启动服务
    [root@node-62 ~]# systemctl start flanneld.service docker.service kube-proxy.service  kubelet.service
    [root@node-62 ~]# ss -tnl
    State       Recv-Q Send-Q Local Address:Port               Peer Address:Port              
    LISTEN      0      128    127.0.0.1:10248                     *:*                  
    LISTEN      0      128    127.0.0.1:10249                     *:*                  
    LISTEN      0      128           *:22                        *:*                  
    LISTEN      0      100    127.0.0.1:25                        *:*                  
    LISTEN      0      128          :::10250                    :::*                  
    LISTEN      0      128          :::10255                    :::*                  
    LISTEN      0      128          :::22                       :::*                  
    LISTEN      0      100         ::1:25                       :::*                  
    LISTEN      0      128          :::4194                     :::*     
    
    制作镜像
    [root@node-62 ~]# mkdir bbox-httpd
    [root@node-62 ~]# cd bbox-httpd/
    #测试网页
    [root@node-62 bbox-httpd]# vim index.html
    <h1>Busybox  Test Httpd Server</h1>
    <h2>k8s cluster</h2>
    
    #dockerfile
    [root@node-62 bbox-httpd]# vim dockerfile
    FROM docker.io/busybox:latest
    MAINTAINER "hehe@hehe.com"
    ADD index.html /appdata/html/
    EXPOSE 80/tcp
    CMD ["/bin/httpd","-f","-h","/appdata/html/"]
    
    #制作镜像
    [root@node-62 bbox-httpd]# docker build ./ -t 192.168.1.61:5000/bbox-httpd:v0.2
    
    
    #推送到私有仓库
    [root@node-62 bbox-httpd]# docker push  192.168.1.61:5000/bbox-httpd:v0.2
    
    #节点2从私有仓库下载镜像
    [root@node-63 ~]# docker pull 192.168.1.61:5000/bbox-httpd:v0.2
    
    
    
    在master节点制作对象,严格控制缩进
    [root@master ~]# vim deploy-bbox.yaml
    
    apiVersion: extensions/v1beta1
    kind: Deployment     
    metadata:
      name: deploy-bbox  #名称
    spec:                         #定义状态
      replicas: 2               #启动2个
      template:                 #模板
        metadata:
          labels:               #标签
            # Apply this label to pods and default
            # the Deployment label selector to this value
            app: bbox        #键值
        spec:
          containers:         #容器
          - name: bbox-httpd     #名称
            # Run this image
            image: 192.168.1.61:5000/bbox-httpd:v0.2         #使用镜像
    
    使用对象创建服务
    [root@master ~]# kubectl -s http://master:8080 create -f ./deploy-bbox.yaml
    deployment "deploy-bbox" created
    
    #检查
    [root@master ~]# kubectl -s http://master:8080 get pods
    NAME                           READY     STATUS    RESTARTS   AGE
    deploy-bbox-2224464794-0qz7g   1/1       Running   0          2m
    deploy-bbox-2224464794-prn3r   1/1       Running   0          2m
    
    
    #在node节点上检查
    [root@node-63 ~]# docker ps
    CONTAINER ID        IMAGE                                                        COMMAND                  CREATED             STATUS              PORTS               NAMES
    a62ea351f09a        registry:5000/bbox-httpd:v0.2                                "/bin/httpd -f -h ..."   27 minutes ago      Up 27 minutes                           k8s_bbox-httpd.80dbe7ba_deploy-bbox-2224464794-prn3r_default_cb54e66f-1e51-11e9-b922-000c294b0a1b_0554d71f
    f182922c8df9        registry.access.redhat.com/rhel7/pod-infrastructure:latest   "/usr/bin/pod"           28 minutes ago      Up 27 minutes                           k8s_POD.ae8ee9ac_deploy-bbox-2224464794-prn3r_default_cb54e66f-1e51-11e9-b922-000c294b0a1b_f68413f2
    
    #查询pod的ip地址
    ...............
     "IPAddress": "10.7.25.2",
    
    #测试,并显示测试页面
    [root@node-63 ~]# curl http://10.7.25.2
    <h1>Busybox  Test Httpd Server</h1>
    <h2>k8s cluster</h2>
    
    #删除服务
    [root@master ~]# kubectl -s http://master:8080 delete -f ./deploy-bbox.yaml
    deployment "deploy-bbox" deleted
    
    
    集群内访问service
    #编辑service对象
    [root@master ~]# vim bbox-httpd-service.yaml
    kind: Service    #定义类型为服务
    apiVersion: v1
    metadata:
      # Unique key of the Service instance
      name: bbox-httpd-service     #名称
    spec:
      ports:
        # Accept traffic sent to port 80
        - name: http
          port: 80                    #监听端口
          targetPort: 80          #暴露端口
      selector:
        # Loadbalance traffic across Pods matching
        # this label selector
        app: bbox
      type: LoadBalancer      #访问为轮询
    
    #创建服务
    [root@master ~]# kubectl -s http://master:8080  create -f ./bbox-httpd-service.yaml 
    service "bbox-httpd-service" created
    
    #查询服务状态
    [root@master ~]# kubectl -s http://master:8080  get service
    NAME                 CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
    bbox-httpd-service   10.254.18.11   <pending>     80:31849/TCP   14s
    kubernetes           10.254.0.1     <none>        443/TCP        7d
    
    [root@master ~]# kubectl -s http://master:8080  describe service
    Name:           bbox-httpd-service
    Namespace:      default
    Labels:         <none>
    Selector:       app=bbox
    Type:           LoadBalancer
    IP:         10.254.241.102
    Port:           http    80/TCP
    NodePort:       http    32303/TCP
    Endpoints:      10.20.52.2:80,10.20.64.2:80
    Session Affinity:   None
    No events.
    
    
    #node节点上的iptable规则
    [root@node-63 ~]# iptables -t nat -vnL | grep 10.254
        0     0 KUBE-SVC-PJU34ZRWOF2LNB5M  tcp  --  *      *       0.0.0.0/0            10.254.241.102       /* default/bbox-httpd-service:http cluster IP */ tcp dpt:80
        0     0 KUBE-SVC-NPX46M4PTMTKRN6Y  tcp  --  *      *       0.0.0.0/0            10.254.0.1           /* default/kubernetes:https cluster IP */ tcp dpt:443
    
    #集群内部访问测试
    [root@node-62 ~]#   curl http://10.254.241.102
    <h1>Busybox  Test Httpd Server</h1>
    <h2>k8s cluster</h2>
    
    [root@node-63 ~]#   curl http://10.254.241.102
    <h1>Busybox  Test Httpd Server</h1>
    <h2>k8s cluster</h2>
    
    

    4、Ingress应用

    因为k8s内部使用的ip,只能集群内部使用,因此集群外部无法访问内部应用或服务的ip地址,建立Ingress使service的url映射映射到master的url上,用户访问master的url即可访问内部service。

    参考链接:https://cloud.tencent.com/developer/article/1156329

    相关文章

      网友评论

        本文标题:搭建kubernetes集群及kubernetes集群的应用

        本文链接:https://www.haomeiwen.com/subject/wsyglqtx.html