美文网首页
Kubernetes

Kubernetes

作者: 小小怪吃吃吃 | 来源:发表于2021-03-17 09:01 被阅读0次

    一、k8s架构

    架构图

    1.1 Master组件

    • APIServer:集群的统一入口,各组件的协调者,以RESTful API、kubectl、Web UI提供接口服务,所有对象资源的增删查改和监听操作都交给APIServer处理后再交给Etcd存储。
    • Controller Manager:管理k8s所有资源对象,一个资源对应一个控制器,Controller Manager就是管理这些控制器的,能保证资源处于预期状态,还能实现pod垃圾回收。
    • Scheduler:负责资源调度,根据调度算法为新创建的Pod选择一个Node节点。

    1.2 Node组件

    • Kubelet:Kubelet是Master在Node节点上的Agent,管理本节点运行容器(Pod)的生命周期,比如创建容器、Pod挂载数据卷、挂载secret等工作,kubelet还会定期将Pod运行状态/信息上报给api-server。
    • kube-proxy:service接收到请求后就需要“kube-proxy”完成流量转发至Pod,它实现的是四层负载均衡转发。

    1.3 其他组件

    • flannel
    • coredns
    • Dashboard
    • Ingress Controller

    二、相关概念

    Kubernetes里的所有资源对象都可以采用YAML或者JSON格式的文件来定义或描述。

    2.1 Pod

    • Pod:调度的最小单位。
    • 一个pod的所有容器都运行在同一个节点上;一个pod绝不跨越两个节点。
    • 同一pod中容器之间的部分隔离:一个pod中的所有容器都在相同的network和UTS命名空间下运行,所以它们都共享相同的主机名和网络接口。
    • 一个pod中的所有容器也都具有相同的loopback网络接口,因此容器可以通过localhost与同一pod中的其他容器进行通信。

    2.2 deployment

    • 维持pod数量。
    • Deployment是Kubernetes在1.2版本中引入的新概念,用于更好地解决Pod的编排问题。
    • Deployment在内部使用了Replica Set来实现目的,可以看作RC的一次升级。
    • Deployment相对于RC的一个最大升级是可以随时知道当前Pod“部署”的进度。

    2.3 service

    • 多个pod抽象为一个服务。
    • Kubernetes的Service定义了一个服务的访问入口地址,前端的Pod通过这个入口地址访问其背后的一组由Pod副本组成的集群实例,Service与其后端Pod副本集群之间则是通过Label Selector来实现无缝对接的。RC的作用是保证Service的服务能力和服务质量始终符合预期标准。


      service
    • Kubernetes的服务发现机制:DNS

    2.4 dns

    默认dns解析,deployment名字对应虚拟的ip。

    2.5 ingress

    端口映射到外网。

    2.6 Label

    • Label可以被附加到各种资源对象上,例如Node、Pod、Service、RC等。
    • 一个资源对象可以定义任意数量的Label,同一个Label也可以被添加到任意数量的资源对象上。
    • 可以通过给指定的资源对象捆绑一个或多个不同的Label来实现多维度的资源分组管理功能,以便灵活、方便地进行资源分配、调度、配置、部署等管理工作。
    • 可以通过Label Selector查询和筛选拥有某些Label的资源对象。

    2.7 Replication Controller

    • RC的定义包括:
      (1)Pod期待的副本数量
      (2)用于筛选目标Pod的Label Selector
      (3)当Pod的副本数量小于预期数量时,用于创建新Pod的Pod模版
    • 在定义了一个RC并将其提交到Kubernetes集群中后,Master上的Controller Manager组件就得到通知,定期巡检系统中当前存活的目标Pod,并确保目标Pod实例的数量刚好等于此RC的期望值,如果有过多的Pod副本在运行,系统就会停掉一些Pod,否则系统会再自动创建一些Pod。
    • 通过RC,Kubernetes实现了用户应用集群的高可用性,并且大大较少了传统手工运维工作。
    • 删除RC并不会影响通过该RC已创建好的Pod。为了删除所有Pod,可以设置replicas的值为0,然后更新该RC。另外,kubectl提供了stop和delete命令来一次性删除RC和RC控制的全部Pod。

    2.8 Horizontal Pod Autoscaler

    • Horizontal Pod Autoscaler(Pod横向自动扩容,HPA),HPA和RC、Deployment一样,也属于一种Kubernetes资源对象。
    • 实现原理:通过追踪分析指定RC控制的所有目标Pod的负载变化情况,来确定是否需要有针对性地调整目标Pod的副本数量。

    2.9 StatefulSet

    • 在Kubernetes系统中,Pod的管理对象RC、Deployment、DaemonSet和Job都面向无状态的服务。
    • StatefulSet从本质上来说,可以看作Deployment/RC的一个特殊变种,实现有状态的集群。

    2.10 Job

    • Job和RC、Deployment类似,也控制一组Pod容器。
    • Job所控制的Pod副本是短暂运行的。
    • Job所控制的Pod副本的工作模式能够多实例并行计算。

    2.11 Volume

    • Volume是Pod中能够被多个容器访问的共享目录。
    • Kubernetes中的Volume与Pod的生命周期相同,但与容器的生命周期不相关。
    • Kubernetes提供了非常丰富的Volume类型:emptyDir、hostPath、gcePersistentDisk、awsElasticBlockStore、NFS等。

    2.12 Persistent Volume

    • PV可以被理解成Kubernetes集群中的某个网络存储对应的一块存储。

    2.13 Annotation

    • Annotation(注解),是用户任意定义的附加信息,以便于外部工具查找。
    • 用Annotation记录的信息有build信息、release信息、docker镜像信息等。

    2.14 ConfigMap

    • ConfigMap配置集中化。

    三、使用kubeadm工具快速安装Kubernetes集群

    3.1 安装脚本

    写了份centos上安装k8s集群的脚本,可参考进行安装。

    set -e
    set -x
    
    if [ "$(whoami)"=="root" ];
    then
        echo "install Kubernets by root";
    else
        echo "need root";
        exit
    fi
    
    if [ -f /etc/redhat-release ]; 
    then
        cat /etc/issue
    else
        echo "暂时此脚本,目前仅在Centos 7中测试"
        exit 0
    fi
    
    # 系统软件包管理器配置
    echo "==========================================================="
    echo " 1 Update PM  "
    echo "==========================================================="
    yum install -y wget
    mkdir -p /etc/yum.repos.d
    if [ "$(rpm -q centos-release|cut -d- -f3)" == "7" ]; then
        wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
    elif [ "$(rpm -q centos-release|cut -d- -f3)" == "6" ]; then
        wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
    elif [ "$(rpm -q centos-release|cut -d- -f3)" == "5" ]; then
        wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-5.repo
    fi
    yum clean all 
    yum makecache
    yum repolist
    
    if docker --version; then
        echo "  Docker Installed  "
        echo $(docker --version)
    else
        echo "==========================================================="
        echo " 2 Docker-ce Installing"
        echo "==========================================================="
        yum install -y yum-utils device-mapper-persistent-data lvm2
        yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
        yum install -y docker-ce-18.09.8
        systemctl enable docker && systemctl start docker
        systemctl status docker
    fi
    
    mkdir -p /etc/docker
    tee /etc/docker/daemon.json <<-'EOF'
    {
      "registry-mirrors": ["https://twoqlji4.mirror.aliyuncs.com"]
    }
    EOF
    systemctl daemon-reload
    systemctl restart docker
    docker version
    # 修改cgroupdriver(是为了消除安装k8s集群时的告警)"exec-opts": ["native.cgroupdriver=systemd"]
    # 查看修改后状态
    # docker info | grep Cgroup
    
    echo "==========================================================="
    echo " 3 PreConfig "
    echo "==========================================================="
    systemctl disable firewalld
    systemctl stop firewalld
    setenforce 0
    sed -i 's/SELINUX=permissive/SELINUX=disabled/' /etc/sysconfig/selinux
    sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
    swapoff -a
    sed -i 's/.*swap.*/#&/' /etc/fstab
    free -m
    
    cat > /etc/sysctl.d/k8s.conf <<EOF
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    EOF
    
    echo "==========================================================="
    echo "  K8s Installing  "
    echo "==========================================================="
    cat > /etc/yum.repos.d/kubernetes.repo <<EOF 
    [kubernetes]
    name=Kubernetes
    baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
    enabled=1
    gpgcheck=1
    repo_gpgcheck=1
    gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
    EOF
    yum clean all
    yum -y makecache
    yum list | grep kubeadm
    yum install -y kubelet-1.17.5 kubeadm-1.17.5 kubectl-1.17.5
    cat > /etc/sysconfig/kubelet <<EOF
    KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
    EOF
    systemctl enable kubelet && systemctl start kubelet
    
    
    echo "==========================================================="
    echo "  Necessary components Installing"
    echo "==========================================================="
    # 下载相关必要组件镜像
    # images=$(kubeadm config images list 2>> /dev/null| grep "k8s.gcr.io"|awk -F "/" '{print $2}')
    # for imageName in ${images[@]} ; do
    #     echo $imageName
    #     docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
    #     docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName
    #     docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
    # done
    # K8sImages=$(docker images|grep k8s.gcr.io|awk '{{printf"%s ",$1":"$2}}')
    # docker save -o k8s.tar $K8sImages
    # docker save -o k8s.tar \
    # k8s.gcr.io/kube-proxy:v1.17.5 \
    # k8s.gcr.io/kube-apiserver:v1.17.5 \
    # k8s.gcr.io/kube-controller-manager:v1.17.5 \
    # k8s.gcr.io/kube-scheduler:v1.17.5 \
    # k8s.gcr.io/coredns:1.6.5 \
    # k8s.gcr.io/etcd:3.4.3-0 \
    # k8s.gcr.io/pause:3.1
    # 加载全部镜像
    docker load -i k8s-1.17.5.tar
    
    # 以下仅master
    hostnamectl set-hostname master
    kubeadm init --apiserver-advertise-address=10.10.66.203 --kubernetes-version v1.17.5 --service-cidr=10.1.0.0/16 --pod-network-cidr=10.81.0.0/16
    # CNI网络插件
    # weave插件安装
    kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
    
    # 以下仅node
    hostnamectl set-hostname node1
    # 在node节点执行加入集群的指令,token和key使用上一步生产得到的值:
    kubeadm join 10.10.66.203:6443 –token 424mp7.nkxx07p940mkl2nd \
    --discovery-token-ca-cert-hash sha256:d88fb55cb1bd659023b11e61052b39bbfe99842b0636574a16c76df186fd5e0d
    

    3.2 kubernetes集群的安全设置

    Kubernetes提供了基于CA签名的双向数字证书认证方式和简单的基于HTTP Base或Token的认证方式。
    (1)基于CA签名的双向数字证书的生成
    (2)基于HTTP Base或Token的简单认证方式

    3.3 Dashboard使用

    • (1)dashboard安装脚本
    kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.1.0/aio/deploy/recommended.yaml
    kubectl get all -n kubernetes-dashboard
    # 修改service类型,将ClusterIP改为NodeIp
    kubectl edit service/kubernetes-dashboard -n kubernetes-dashboard
    # 查看外网访问端口
    kubectl get all -n kubernetes-dashboard
    
    kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')
    

    四、kubectl命令行工具用法

    kubectl命令行语法如下:
    kubectl [command] [TYPE] [NAME] [flags]

    • command:子命令,用于操作Kubernetes集群资源对象的命令,例如create、delete、describe、get、apply等。
    • TYPE:资源对象的类型,区分大小写,能以单数、复数或者简写形式表示,例如pod(pods/po)、nodes等。
    • NAME:资源对象的名称,区分大小写。如果不指定名称,系统则将返回属于TYPE的全部对象的列表。
    • flags:kubectl子命令的可选参数,例如使用“-s”指定API Server的URL地址。

    4.1 kubectl输出格式

    -o json/wide/yaml等。
    其中wide是输出额外信息。

    4.2 操作示例

    # 创建资源对象
    kubectl create -f my-service.yaml -f my-rc.yaml
    
    # 查看资源对象
    kubectl get pods,rc,service
    
    # 描述资源对象
    kubectl describe nodes/pods <name>
    
    # 删除资源对象
    kubectl delete -f pod.yaml
    kubectl delete pods,services -l name=<label-name>
    
    # 执行容器的date命令
    kubectl exec <pod-name> -c <container-name> date
    
    # 查看容器的日志
    kubectl logs -f <pod-name> -c <container-name>
    
    # 在线编辑运行中的资源对象
    kubectl edit deploy nginx
    

    相关文章

      网友评论

          本文标题:Kubernetes

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