zoukankan      html  css  js  c++  java
  • kubernetes 集群

    一、CentOS 7 基础环境准备

    centos 7 默认服务目录
    /usr/lib/systemd/system
    
    systemctl服务开机启动链接存贮目录:
    /etc/systemd/system/basic.target.wants/

    列出所有开机自启的服务
    systemctl list-unit-files|grep enabled

      1、Centos7 防火墙 默认是 firewall

    想和centos 6 一样配置 iptables;可以直接 
    # yum update iptables
    
    也可以直接安装 
    # yum install iptables iptables-devel iptables-services iptables-utils
    
    关闭 firewalld 开启iptables Systemctl stop firewalld Systemctl disable firewalld systemctl restart iptables.service systemctl status iptables.service systemctl enable iptables.service

      2、网络设置network

    使用 static 地址和配置DNS
    Centos
    7 的网卡名称从默认eth更改为ifcfg-en开头的; CentOS6 及之前以太网网卡进行顺序命名的;多网卡如:eth0,eth1 依次; Centos7 则不同,命名规则默认是基于固件、拓扑、位置信息来分配;

      查看网卡信息:

    查看 ip 地址
    # ip addr show 如果用户不习惯可以更新 ifconfig 然后再查看; # yum update ifconfig 没有的话 可以在直接安装 net
    -tools # yum install net-tools

      3、关闭selinux

    # sed -i '/^SELINUX=/cSELINUX=disabled' /etc/sysconfig/selinux 

      4、更新 yum 源

    # cat /etc/yum.repos.d/virt7-docker-common-release.repo
    
    [virt7-docker-common-release]
    name=virt7-docker-common-release
    baseurl=http://cbs.centos.org/repos/virt7-docker-common-release/x86_64/os/
    gpgcheck=0

      5、时间校验 时间服务(这个有多种方式)

    # yum install ntp
    
    systemctl restart ntpd.service
    也可以部署时间服务器进行校验

      6、规划分布

    10.100.10.100 master
    10.100.10.105 minion1 (node1)
    10.100.10.106 minion2 (node2)
    也可以去绑定主机头
    /etc/hosts

    二 、kubernetes

      Kubernetes 用于管理云平台中多个主机上的容器化的应用,就是一个容器集群的管理工具。

      在k8s中 所有的容器都是定义在 一个POD 中运行,cloudstack 也有这个概念。一个Pod承载着多个容器,同一个Pod中的容器会部署在同一个物理机器上并且能够共享资源。个Pod也可以包含O个或者多个磁盘卷组(volumes),这些卷组将会以目录的形式提供给一个容器,或者被所有Pod中的容器共享,对于用户创建的每个Pod,系统会自动选择那个健康并且有足够容量的机器,然后创建类似容器的容器,当容器创建失败的时候,容器会被node agent自动的重启,这个node agent叫kubelet,但是,如果是Pod失败或者机器,它不会自动的转移并且启动,除非用户定义了 replication controller。

      API对象是K8s集群中的管理操作单元,所以有很多的容错性和可扩展性。

      Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制。

    三、master 服务端:

      IP : 10.100.10.100

    安装主程序:
    # yum install etcd flannel docker kubernetes

      1、Etcd

      etcd 是 CoreOS 团队发起的一个管理配置信息和服务发现(service discovery)的项目;类似zookeeper ,Apache ZooKeeper也是做分布式系统中进行同步和一致性管理的。因为在分布式系统中,各种服务的配置信息的管理分享,服务的发现是一个很基本同时也是很重要的问题。

      使用 etcd 可以在多个节点上启动多个实例,并添加它们为一个集群。同一个集群中的 etcd 实例将会保持彼此信息的一致性。

    etcd.conf 文件配置示例 :

    # cat etcd.conf
    
    ETCD_NAME=default
    ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
    ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
    ETCD_ADVERTISE_CLIENT_URLS="http://localhost:2379"

      启动 :

    systemctl start etcd.services

      2、虚拟网络(可以供docker虚拟网络)
      可以使用 flannel,或者openvswitch

    在etcd里定义创建flannel网络配置:
    # etcdctl mk /atomic.io/network/config '{"Network":"172.16.0.0/16"}'

      3、etcdctl 常用命令;

    backup 备份目录
    cluster-health 集群健康检测
    mk 创建一个键值设置属性 
    mkdir 创建目录
    rm 删除
    rmdir 如果目录为空 删除所有
    get 查看键的属性

      4、kubernetes -master 配置;

        4.1、config配置示例:

    # cat /etc/kubernetes/config |grep -v ^$ |grep -v ^#
    KUBE_LOGTOSTDERR
    ="--logtostderr=true" KUBE_LOG_LEVEL="--v=0" KUBE_ALLOW_PRIV="--allow-privileged=false" KUBE_MASTER="--master=http://docker-master:8080"

        4.2、apiserver 配置示例:

    # cat /etc/kubernetes/apiserver |grep -v ^$ |grep -v ^#
    
    KUBE_API_ADDRESS="--address=0.0.0.0"
    KUBE_API_PORT="--port=8080"
    KUBE_MASTER="--master=http://docker-master:8080"
    KUBELET_PORT="--kubelet-port=10250"
    KUBE_ETCD_SERVERS="--etcd-servers=http://127.0.0.1:2379"
    KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"
    KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"
    KUBE_API_ARGS=""

        4.3、kubelet配置示例:

    # cat /etc/kubernetes/kubelet |grep -v ^$ |grep -v ^#
    
    KUBELET_ADDRESS="--address=127.0.0.1"
    KUBELET_HOSTNAME="--hostname-override=127.0.0.1"
    KUBELET_API_SERVER="--api-servers=http://127.0.0.1:8080"
    KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"
    KUBELET_ARGS=""

      5、添加启动项、启动、并查看状态:

    # cat start-kube.sh 
    for SERVICES in etcd docker kube-apiserver kube-controller-manager kube-scheduler; do systemctl enable $SERVICES systemctl restart $SERVICES systemctl status $SERVICES done

      7、服务检测:

    1. 检测端口;ss -tln

    2. 查看 docker 网络

    # ifconfig docker 
    查看 docker 网络 172.16.0.0/16 网络

    3. master 检测节点(暂时没有):

    # kubectl get nodes
    NAME STATUS AGE

    4. 异常排错:可以根据提示进行查看启动运行异常的信息

    # journalctl -xe 查看错误信息
    dhcp 问题
    DNS问题 镜像下载问题 ca 认证问题

    四、kubernettes - minion 节点

    1. 环境安装

    节点 主程序
    yum -y install flannel docker kubernetes

    2. 配置 flannel

    # cat /etc/sysconfig/flanneld
    FLANNEL_ETCD_ENDPOINTS
    ="http://10.100.10.100:2379"

    # etcd 节点名称

    FLANNEL_ETCD_PREFIX="/atomic.io/network"

    # flannel网络 可以设置成master主机IP

    1、kubernetes minion 端配置示例参考;

    主要也是这个文件 config kubetle apiserver (minion 配置基本一样的,kubelet 中 KUBELET_HOSTNAME 设置为本机IP 地址)

        1.1、apiserver 文件

    # cat apiserver |grep -v ^$ |grep -v ^#
    
    KUBE_API_ADDRESS="--address=127.0.0.1"
    KUBE_ETCD_SERVERS="--etcd_servers=http://10.100.10.100:2379"
    KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"
    KUBE_ADMISSION_CONTROL="--admission_control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"

        1.2、config 文件

    # cat config |grep -v ^$ |grep -v ^#
    
    KUBE_LOGTOSTDERR="--logtostderr=true"
    KUBE_LOG_LEVEL="--v=0"
    KUBE_ALLOW_PRIV="--allow_privileged=false"
    KUBE_MASTER="--master=http://10.100.10.100:8080"
    KUBE_ETCD_SERVERS="--etcd-servers=http://10.100.10.100:2379"

        1.3、kubelet 文件

    # cat kubelet |grep -v ^$ |grep -v ^#
    
    KUBELET_ADDRESS="--address=0.0.0.0"
    KUBELET_PORT="--port=10250"
    KUBELET_HOSTNAME="--hostname-override=10.100.10.105"
    # KUBELET_HOSTNAME 设置minion端主机IP (node2 就是设置为 10.100.10.106)
    KUBELET_API_SERVER="--api-servers=http://10.100.10.100:8080"
    KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"

      2、minion 端添加启动项、启动、并查看状态;

    # cat minion-kube.sh
    for SERVICES in kube-proxy kubelet docker flanneld; do
    systemctl enable $SERVICES
    systemctl restart $SERVICES
    systemctl status $SERVICES 
    done

      3、检测服务

    ss -tln 
    # 检测进程端口;
    # ifconfig docker 查看docker网络
    172.16.0.0/16 网络;
    再返回 master 端检测节点:
    # kubectl
    get nodes
    NAME STATUS AGE

    五、Kubernetes Web UI 
      1、创建kubernetes-dashboard.yaml

    从官网下载 yaml 文件;
    wget https://rawgit.com/kubernetes/dashboard/master/src/deploy/kubernetes-dashboard.yaml

    2、编辑 kubernetes-dashboard.yaml 文件;

    配置示例(版本不是最新,可按照部署最新进行编辑修改):

    # cat kubernetes-dashboard.yaml 
    # Copyright 2015 Google Inc. All Rights Reserved.
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #     http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    
    # Configuration to deploy release version of the Dashboard UI.
    #
    # Example usage: kubectl create -f <this_file>
    
    kind: Deployment
    apiVersion: extensions/v1beta1
    metadata:
      labels:
        app: kubernetes-dashboard
      name: kubernetes-dashboard
      namespace: kube-system
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: kubernetes-dashboard
      template:
        metadata:
          labels:
            app: kubernetes-dashboard
          # Comment the following annotation if Dashboard must not be deployed on master
          annotations:
            scheduler.alpha.kubernetes.io/tolerations: |
              [
                {
                  "key": "dedicated",
                  "operator": "Equal",
                  "value": "master",
                  "effect": "NoSchedule"
                }
              ]
        spec:
          containers:
          - name: kubernetes-dashboard
            image: docker.io/mritd/kubernetes-dashboard-amd64
         # 如果有网络问题,images 也可以自己创建 docker 私有库;地址写成自己的; 
            #imagePullPolicy: Always
            imagePullPolicy: IfNotPresent 
         # 不存在 就下载
            ports:
            - containerPort: 9090
              protocol: TCP
            args:
              # Uncomment the following line to manually specify Kubernetes API server Host
              # If not specified, Dashboard will attempt to auto discover the API server and connect
              # to it. Uncomment only if the default does not work.
              # - --apiserver-host=http://my-address:port
              - --apiserver-host=http://10.100.10.100:8080
          # master 主机 apiserver
            livenessProbe:
              httpGet:
                path: /
                port: 9090
              initialDelaySeconds: 30
              timeoutSeconds: 30
    ---
    kind: Service
    apiVersion: v1
    metadata:
      labels:
        app: kubernetes-dashboard
      name: kubernetes-dashboard
      namespace: kube-system
    spec:
      type: NodePort
      ports:
      - port: 80
        targetPort: 9090
      selector:
        app: kubernetes-dashboard

    3、创建 Pod (image 位置;设置下载地址有关 需要等一会)

    # kubectl create -f kubernetes-dashboard.yaml
    
    # 创建 pod 失败删除
    # 可以使用 kubectl delete -f kubernetes-dashboard.yaml 删除

      4、检测 pods

      pods 检测

    # kubectl get pods --all-namespaces
    
    NAMESPACE NAME READY STATUS RESTARTS AGE
    kube-system kubernetes-dashboard-3713835017-4nbkp 1/1 Running 1 5m

      services 检测

    # kubectl get services --all-namespaces
    NAMESPACE NAME CLUSTER
    -IP EXTERNAL-IP PORT(S) AGE default kubernetes 10.254.0.1 <none> 443/TCP 33m kube-system kubernetes-dashboard 10.254.211.205 <nodes> 80:30491/TCP 5m

      5、查看 service 信息

    # kubectl describe service/kubernetes-dashboard --namespace="kube-system"
    
    Name:    kubernetes-dashboard
    Namespace:    kube-system
    Labels:    app=kubernetes-dashboard
    Selector:    app=kubernetes-dashboard
    Type:    NodePort
    IP:    10.254.211.205
    Port:    <unset>    80/TCP
    NodePort:    <unset>    30491/TCP
    Endpoints:    172.16.4.4:9090
    Session Affinity:    None

      6、异常处理

    1、查看 pods 信息描述;
    # kubectl describe pod/kubernetes-dashboard-3713835017-4nbkp --namespace="kubectl-system"
    
    2、查看日志信息;
    # kubectl logs -f kubernetes-dashboard-3713835017-4nbkp --namespace=kube-system

      7、测试访问:

    K8s 集群提供虚拟的隔离作用,K8s集群初始有两个名字空间,分别是默认名字空间 default 和系统名字空间 kube-system

    http://master:8080/ui/

    六、kubectl 常用命令:也就是 kubectl 进行交互操作执行。

      1. 检测信息命令

    # 查看集群信息
    kubectl cluster-info
    # 查看各组件信息
    kubectl -s http://localhost:8080 get componentstatuses
    # 查看pods所在的运行节点
    kubectl get pods -o wide
    # 查看pods定义的详细信息
    kubectl get pods -o yaml
    # 查看Replication Controller信息
    kubectl get rc
    # 查看service的信息
    kubectl get service
    # 查看节点信息
    kubectl get nodes
    # 按selector名来查找pod
    kubectl get pod --selector name=redis
    # 查看运行的pod的环境变量
    kubectl exec pod名 env

      2、操作类命令

    # 创建
    kubectl create -f 文件名
    # 重建
    kubectl replace -f 文件名 [--force]
    # 删除
    kubectl delete -f 文件名
    kubectl delete pod pod名
    kubectl delete rc rc名
    kubectl delete service service名
    kubectl delete pod --all

     

      

      

  • 相关阅读:
    2017.10.16 java中getAttribute和getParameter的区别
    2017.10.15 解析Java中抽象类和接口的区别
    2017.10.14 Java的流程控制语句switch&&随机点名器
    2017.10.13 Java中引用类型变量的创建及使用&循环高级写法
    2017.10.12 Java的计数器的开发
    2017.10.11 ”学生身体体质信息管理系统“的开发
    2017.10.10 java中的继承与多态(重载与重写的区别)
    一次redis悲观锁 实现 微信jssdk token缓存
    HashSet原理 与 linkedHashSet
    jdk并发容器整理(yet)
  • 原文地址:https://www.cnblogs.com/sharesdk/p/8358694.html
Copyright © 2011-2022 走看看