k8s介绍

作者: 麟之趾a | 来源:发表于2020-08-28 11:11 被阅读0次

    [toc]

    k8s

    k8s是容器编排系统
    Master: api server,scheduler,controller-manager 控制平面
    api server: 部署完成后默认监听的所有地址(0.0.0.0)6443(早期的k8s版本,会提供两个套接字8080和6443),8080是明文协议,6443是密文协议。由于明文不安全,现在只剩6443端口。
    接入api server时, 应该使用node网络的6443端口,与之交互
    api server:要做用户认证,双向认证。它不仅要自己的证书,而且还需要客户端证书。而这个证书也应该由k8s认证的CA机构颁发存在。在/etc/kubernets/pki 下的证书,在admin.conf 下就有认证api server的证书路径
    scheduler:调度node
    controller-manager: 控制器创建pod

    k8s上的资源

    Pod, Pod Controller,Service
    Pod创建: 
    1、直接创建
    2、Pod controller 创建
    Pod Controller 有多种类型,Deployment 是一种类型,需要向类型属性附值,才能创建出特定的控制器。
    service: 也是一种类型,向service属性附值,创建出service对象
    

    工作平面

    Node:
    1.运行Pod
    2.把设定在Pod上的service转换成ipvs或iptables
    以上两种功能,主要有运行在Node上的组件kube-proxy完成。它会监控每个service的变化,来完成相应的ipvs和iptables规则转换
    

    k8s资源级别

    k8s有集群级别资源和名称空间级别资源
    在集群资源级别,可以划分多个名称空间。
    kubectl get ns 查看集群上的名称空间
    一般安装完k8s会有名称空间
    default:默认的名称空间,没有运行任何Pod
    kubectl get pods 查看默认名称空间下的Pod
    kube-public 指公共的名称空间
    kube-system 系统级别的名称空间,所有的Pod都运行,在此名称空间下
    Pods 名称空间级别的资源
    kubectl get pods -n kube-system -o wide 显示 Pod的长格式,Pod运行的节点和Pod的IP
    kubectl api-resources 查看当前系统上支持多少种资源类型

    创建资源

    kubectl create -h   查看帮助
    kubectl create namespace testing 创建测试环境
    kubectl create namespace develop 创建名称空间(开发环境)
    kubectl delete namespace develop  删除资源
    kubectl delete ns/testing   删除testing名称空间
    kubectl delete ns/develop
    
    kubectl create deployment
    kubectl create deployment nginx-dep --image=nginx:1.14-alpine  创建deployment控制器nginx-dep,并拉取镜像nginx:1.14-apline
    1.先创建ngx-dep控制器
    2.再由这个控制器创建指定镜像的Pod
    
    创建service
     kubectl create service clusterip ngx-svc  --tcp 80:80
    kubectl get svc/ngx-svc -o yaml   由于此处没有指定Pod,此处创建不合理
    kubectl create service clusterip ngx-dep --tcp 80:80
    kubectl descibe ngx-dep 查看是否添加到了后端节点Pod,注意如果没有添加上注意service的标签选择器选择的pod标签是否 后端pod的标签相同
    
    
    动态伸缩
    kubectl scale -h
    kubectl scale --replicas=3 deploy ngx-dep  //deployment可以动态扩缩容
    kubectl create svc nodeport ngx-dep --tcp=80:80
    kubectl desribe svc/ngx-dep  //查看service服务是否挂载了Pod
    访问任一宿主机端口,都能访问pod内容,因为每个宿主机都做了iptables规则
    因为每个Node都运行着kube-proxy
    

    查询资源

    kubectl get 资源/资源名称
           -o wide  长格式显示
           -o  yaml以yaml格式显示资源
    每个资源基本于 apiVersion,kind,metadata,spec,status 五个一级字段组成
    -o  json 输出json格式
    输出资源的描述信息,一般查看状态信息
    kubectl describe 资源/资源名称
    
    

    k8s所有的东西,都是围绕Pod展开的
    service:是让Pod访问更加固定
    deployment:是让Pod更加稳定

    image.png
    apiserver:相当于集线器,所有组件都与api server交互,因为api server有严格的访问控制
    而与etcd交互的只有apiserver,因为etcd存放用户所有的请求信息。如果etcd崩溃。整个k8s集群崩溃,所以我们要定时备份etcd中的数据,并且要给etcd做成集群
    apiserver是整个集群的gateway
    k8s的api是HTTP格式的api,是json格式的,能展示为yaml。是把json转换成yaml,提交是json格式,也支持grpc协议。(RPC是远程服务调用),grpc是Google的RPC。
    api server:是RESTFUL风格的api,是表征状态转移(REST)
    Api server:把api 接口中的资源分为了多个逻辑组合
    每个组合为api group,即api 群组
    kubectl api-version  显示有多少个群组,master上执行
    v1 是核心资源群组
    每一个资源,一定是某个群组下的属性赋值。每个组可以独立演进,每个组还可以多版本共存。资源对象的配置格式
    Api server 接受和返回的所有JSON对象,都遵循同一模式,它们都具有'kind'和'api version'字段,用于标识对象所属资源类型,API 群组及相关版本
    大多数的对象和列表资源还需要三个嵌套类型的字段,metadata,spec和status
    metadata:字段为资源提供源数据信息,例如名称、隶属的名称空间和标签
    spec: 用户定义用户。期望的状态,不同的资源类型其状态意义各不相同。例如:Pod资源最为核心的功能在于运行容器
    status: 则记录着活动对象的当前状态信息,它由kubernets系统自行维护,对于用户来说为只读字段'kubectl api-resources'这个命令可以获取集群支持的所有资源类型
    和解循环(Reconciliation loop)
    客户端向api server提交POST请求以创建对象,控制器负责将其创建为kubernets集群上的具体对象(活动对象),并确保当前状态(status)与用户定义的期望状态相同
    控制器通过和解循环(loop)不间断的监控着相关对象的当前状态,在对象的当前状态发生改变时运行合适的操作,让其当前状态无线接近期望的状态
    

    Pod资源说明

    kubectl的命令可分为三类
    陈述式命令(Imperative Commands)直接创建资源
    陈述式对象配置(Imperative Object Configuration) 使用yaml或json 格式定义资源,然后使用create 命令创建资源
    声明式对象配置(Declarative Object Configuration)使用yaml和json格式定义资源,使用apply命令进行对资源的增删改查。一般使用apply 做增和改,删除还用delete

    [root@k8s-master basic]# cat develop-ns.yaml 
    apiVersion: v1
    kind: Namespace
    metadata:
      name: develop
    
    kubectl create -f develop-ns.yaml
    kubectl get namespace
    kubectl delete -f develop-ns.yaml
    kubectl apply -f develop-ns.yaml
    如果配置文件修改,重新apply 一下就可以,apply 可以指定一个目录,用来加载这个目录下所有的配置文件
     kubectl get pods ngx-dep-5d855b5b54-85c7p -o yaml > pod.yaml  //可以导出pod yaml
    [root@k8s-master basic]# cat pod.yaml 
    apiVersion: v1
    kind: Pod
    metadata:
     name: pod-daemon
     namespace: develop
    spec:
     containers:
       - name: myapp
         image: ikubernetes/myapp:v1
         imagePullPolicy: IfNotPresent
    
    ---------------------------------------------------------------------------------------
    imagePullPolicy:有三种策略拉取镜像
    1、always 无论有没有镜像都会从互联网上拉下来
    2、nerver 如果本地没有镜像,就会启动不成功
    3、ifNotPresent: 如果本地有,就直接启动。如果本地没有就从互联网pull下来
    如果不定义imagepullPolicy的话,会根据镜像的标签的值进行pull策略,镜像的标签值是latest,则默认是always。如果标签的值是具体版本号,则默认值是IfNotPresent
    
    pod的配置清单的其他字段,在spec下的containers
    name: 容器的名字
    resource:定义此容器所使用的资源
    dnsPolicy:定义我们的dns的策略
         clusterFirst: 是首先使用k8s集群的dns
    enableServiceLinks: true 定义pod是否被service引用
    priority: 0 定义此容器的优先级,与容器优先级很像
    restartPolicy: always 重启策略,always 只要容器一down就立即重启
    securityContext: 安全上下文
    kubectl explain pods 查询pods定义
    kubectl explain pods.metadata  可以向下一级查询,只要下一级为object对象
    [root@k8s-master basic]# cat pod-daemon.yaml 
    apiVersion: v1
    kind: Pod
    metadata:
     name: pod-daemon-2
     namespace: develop
    spec:
     containers:
       - name: myapp
         image: ikubernetes/myapp:v1
         imagePullPolicy: IfNotPresent
       - name: bbox
         image: busybox:latest
         imagePullPolicy: IfNotPresent
         command:
          - /bin/sh
          - -c
          - "sleep 86400"
    kubectl apply -f pod-daemon-2.yaml
    kubectl get pods -n develop
    kubectl exec pod-daemon-2 -c bbox -h  //查看帮助
    kubectl exec pod-daemon-2 -c bbox -n develop -it -- /bin/sh
    -c 指定pod里面容器的名字
    -it 进入正在运行的pod里面,
    kubectl logs -h 查看容器的日志
    kubectl logs pod-daemon-2 -n develop -c myapp 
    -c 指定容器名字
    如果pod里面只有一个容器,则直接 kubectl logs pod 即可
    kubectl  explain pods.spec.containers.ports //查看容器暴露端口说明
    hostPort: 指在宿主机上使用DNAT,映射此端口,与service 的 nodePort不同的是,此处定义的Port,只在容器宿主机上进行DNAT规则
    [root@k8s-master basic]# cat host-pod.yaml 
    apiVersion: v1
    kind: Pod
    metadata:
      name: mypod
      namespace: default
    spec:
      containers:
        - name: myapp
          image: ikubernetes/myapp:v1
          ports:
           - protocol: TCP
             containerPort: 80
             name: http
             hostPort: 8080
    
     pod如何被集群外部所访问
    1. service 的NodePort
    2. hostPort
    3. hostNetwork
    

    相关文章

      网友评论

          本文标题:k8s介绍

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