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