k8s入门教程

一、k8s应用安装

二、集群客户端工具 kubectl

1、检查kubectl是否安装

rpm -qa|grep kubectl

2、获取kubectl帮助方法

kubectl --help

3、kubectl 子命令使用分类

  • 基础命令 (Beginner)
命令 描述
create 通过文件名称或标准输入创建资源
expose 使用 replication controller, service, deployment 或者 pod 并暴露它作为一个 新的 Kubernetes Service
run 在集群中运行一个指定的镜像
set 为 objects 设置一个指定的特征
  • 基础命令 (Intermediate)
命令 描述
explain 查看资源的文档
get 显示一个或更多 resources
edit 在服务器上编辑一个资源
delete 通过文件名、标准输入、资源名称或标签选择器来删除资源
  • 部署命令
命令 描述
rollout 管理资源的发布
scale 扩容或缩容Pod数量,Deployment、ReplicaSet、RC或job
autoscale 创建一个自动选择扩容或缩容并设置Pod数量
  • 群集管理命令
命令 描述
certificate 修改 certificate 资源.
cluster-info 显示集群信息
top 显示 Resource (CPU/Memory) 使用.
cordon 标记 node 为 unschedulable
uncordon 标记 node 为 schedulable
drain 驱逐节点上的应用,准备下线维护
taint 更新一个或者多个 node 上的 taints
  • 故障诊断和调试命令
命令 描述
describe 显示一个指定 resource 或者 group 的 resources 详情
logs 输出容器在 pod 中的日志
attach Attach 到一个运行中的 container
exec 在一个 container 中执行一个命令
port-forward 转发一个或多个本地端口到一个pod
proxy 运行一个 proxy 到 Kubernetes API server
cp 复制 files 和 directories 到 containers 和从容器中复制 files 和 directories.
auth 检查授权
debug 创建调试会话以对工作负载和节点进行故障排除
  • 高级命令
命令 描述
diff 将实时版本与可能应用的版本区分开来
apply 通过文件名或标准输入流(stdin)对资源进行配置
patch 使用补丁修改、更新资源的字段
replace 通过 filename 或者 stdin替换一个资源
wait 实验性:等待一个或多个资源上的特定条件
kustomize 从目录或URL构建kustomization目标
  • 设置命令
命令 描述
label 更新在这个资源上的 labels
annotate 更新一个资源的注解
completion 用于实现kubectl工具自动补全
  • 其它命令
命令 描述
api-resources 打印受支持的API资源
api-versions 打印受支持的API版本
config 修改 kubeconfig 文件
plugin 运行一个命令行插件
version 输出 client 和 server 的版本信息

4、使用kubectl命令的必要环境

  • work节点如果想使用kubectl命令,需要从master节点复制config文件
mkdir .kube
scp k3s-master1:/root/.kube/config .kube/

# 使用命令验证
kubectl get nodes

三、集群资源清单(YAML)文件

1、基本语法

  • 使用空格作为缩进
  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
  • 低版本缩进时不允许使用Tab键,只允许使用空格
  • 使用#标识注释,从这个字符一直到行尾,都会被解释器忽略

2、YAML支持的数据结构

  • 对象:

    • 键值对的集合
    • 又称为映射(mapping) / 哈希(hashes) / 字典
      (dictionary)
    对象类型:对象的一组键值对,使用冒号结构表示 
    name: Tom 
    age: 18 
    
    Yaml 也允许另一种写法,将所有键值对写成一个行内对象 
    hash: { name: Tom, age: 18 }
    
  • 数组:

    • 一组按次序排列的值
    • 又称为序列(sequence) / 列表 (list)
    数组类型:一组连词线开头的行,构成一个数组 
    People 
    - Tom 
    - Jack 
    
    数组也可以采用行内表示法 
    People: [Tom, Jack]
    
  • 纯量(scalars)

    • 单个的、不可再分的值
    纯量:纯量是最基本的、不可再分的值。以下数据类型都属纯量
    
    数值直接以字面量的形式表示 
    number: 12.30 
    
    布尔值用true和false表示 
    isSet: true 
    
    null用 ~ 表示 
    parent: ~ 
    
    时间采用 ISO8601 格式 
    iso8601: 2001-12-14t21:59:43.10-05:00 
    
    日期采用复合 iso8601 格式的年、月、日表示 
    date: 1976-07-31 
    
    YAML 允许使用两个感叹号,强制转换数据类型
    e: !!str 123 
    f: !!str true
    
    字符串默认不使用引号表示 
    
    str: 这是一行字符串 
    
    
    如果字符串之中包含空格或特殊字符,需要放在引号之中 
    
    str: '内容: 字符串' 
    
    
    单引号和双引号都可以使用,双引号不会对特殊字符转义 
    s1: '内容\n字符串' 
    s2: "内容\n字符串" 
    
    
    单引号之中如果还有单引号,必须连续使用两个单引号转义 
    str: 'labor''s day' 
    
    字符串可以写成多行,从第二行开始,必须有一个单空格缩 进。换行符会被转为 空格 
    str: 这是一段 
      多行字
      符串 
      
    多行字符串可以使用|保留换行符,也可以使用>折叠换行 
    this: | 
    Foo 
    Bar 
    that 
    Foo 
    Bar
    

3、资源清单描述方法

  • 在k8s中,一般使用YAML格式的文件来创建符合我们预期期望的pod,这样的YAML文件成为资源清单。

3.1、常用字段

3.2、举例说明

  • 创建一个namespace
apiVersion: v1 
kind: Namespace 
metadata: 
  name: test 
  • 创建一个pod
apiVersion: v1 
kind: Pod 
metadata: 
  name: pod1 
spec: 
  containers: 
  - name: nginx-containers 
    image: nginx:latest

四、NameSpace(命名空间)

1、场景介绍

我们接到项目组同事的第一个任务,需要准备两套k8s集群用于开发测试及预发布,但是由
于项目组可用主机资源有限,没有那么多主机可用,不能满足两套k8s集群的要求,所以播仔就想在现有的k8s集群中运行两套环境,你觉得可行吗?答案是可行的,我们可以使用k8s集群中的命名空间即可实现开发测试与预发布环境的隔离。

2、NameSpace介绍

  • 命名空间
  • 作用:多租户情况下,实现资源隔离
  • 属于逻辑隔离
  • 属于管理边界
  • 不属于网络边界
  • 可以针对每个namespace做资源配额

3、查看NameSpace

kubectl get namespace

默认命名空间说明

  • default 用户创建的pod默认在此命名空间
  • kube-public 所有用户均可以访问,包括未认证用户
  • kube-node-lease kubernetes集群节点租约状态 v1.13加入
  • kube-system kubernetes集群在使用

4、创建NameSpace

  • 通过kubectl命令行创建
kubectl create namespace test
  • 通过Kubectl命令应用资源清单文件创建
# 创建资源清单
vim 01-create-ns.yaml

#内容如下
apiVersion: v1 
kind: Namespace 
metadata: 
  name: demons1 
  
# 应用资源清单文件
kubectl apply -f 01-create-ns.yaml

5、删除NameSpace

注:删除命名空间的同时,命名空间中包含所有的资源对象同时被删除

  • 通过kubectl命令行删除
kubectl delete namespace test
  • 通过kubectl命令应用资源清单文件删除
kubectl delete -f 01-create-ns.yaml

五、集群核心概念 Pod

1、场景介绍

如果我们想在k8s集群中运行应用程序,应该使用什么资源对象呢?我们知道k8s集群中是不能直接运行容器的,k8s集群中最小调度单元为Pod,因此我们要使用Pod来运行应用程序。

2、Pod介绍

  • Pod是kubernetes集群能够调度的最小单元
  • Pod是容器的封装

3、查看Pod

  • 查看default命名空间中的Pod
kubectl get pod
或
kubectl get pods
或
kubectl get pods --namespace default
或
kubectl get pod --namespace default

4、创建Pod

  • 编写用于创建Pod资源清单文件(02-create-pod.yaml)
apiVersion: v1 
kind: Pod 
metadata: 
  name: pod1 
spec:
  containers: 
  - name: ngninx-pod 
    image: nginx:latest 
    ports: 
    - name: nginxport 
      containerPort: 80
  • 应用用于创建Pod资源清单文件
kubectl apply -f 02-create-pod.yaml
  • 验证Pod是否被创建
kubectl get pods
  • 通过指定默认命名空间查看已创建pod
kubectl get pods -n default
  • 查看pod更加详细信息
kubectl get pods -o wide

5、Pod访问

curl 10.72.1.11

6、删除Pod

  • kubectl 命令行删除
kubectl delete pods pod1
  • 通过kubectl通过Pod资源清单文件删除
kubectl delete -f 02-create-pod.yaml

六、集群核心概念 Controller

1、Controller介绍

  • 控制器
  • 用于对应用运行的资源对象进行监控
  • 当pod出现问题的时候,会把Pod重新拉起,以达到用户期望的状态

2、Controller分类

控制器名称 作用
Deployment 声明式更新控制器,用于发布无状态应用
ReplicaSet 副本集控制器,用于对Pod进行副本规模扩大或剪裁
StatefulSet 有状态副本集,用于发布有状态应用
DeamonSet 在k8s集群每一个Node上运行一个副本,用于发布监控或日志收集类等应用
Job 运行一次性作业任务
CronJob 运行周期性作业任务

3、Deployment 控制器介绍

  • 具有上线部署,滚动升级,创建副本,回滚以前某一版本(成功/稳定)等功能
  • Deployment包含ReplicaSet,除非需要自定义升级功能或者不需要升级Pod,否则还是建议使用Deployment而不直接使用Replica Set。

4、创建Deployment控制器应用

4.1通过kubectl命令行创建

  • kubectl命令创建
kubectl run nginx-app --image=nginx:latest --image-pull-policy=IfNotPresent --replicas=2

说明
nginx-app 是deployment控制器类型的应用名称
nginx:latest 是应用运行的Pod中的Container所使用的镜像
IfNotPresent 是Container容器镜像下载策略,如果本地有镜像,使用本地,如果本地没有镜像,下载镜像
--replicas 是指应用运行的Pod共计2个副本,这是用户的期望值
  • 查看Deployment控制器类型
kubectl get deployment
或
kubectl get deployment.apps
  • 查看ReplicaSet控制器类型
kubectl get replicaset
或
kubectl get replicaset.apps

4.2、通过资源清单文件创建

  • 创建03-creat-deployment-app.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx-app-container
        image: nginx:latest
        imagePullPolicy: IfNotPresent
        ports:
        - name: nginx-app2
          containerPort: 80

5、删除Deployment

带有控制器类型的Pod不能随便删除,如果必须删除,请删除控制器类型的应用名称

  • 通过kubectl命令行删除
# 查询
kubectl get deployment.apps

# 删除
kubectl delete deployment.apps nginx-app
  • 通过kubectl应用资源清单删除
kubectl delete -f 03-creat-deployment-app.yaml

七、集群核心概念 Service

1、Service介绍

  • 不是实体服务
  • 只是一条iptables或者ipvs的转发规则

2、Service作用

  • 通过Service为Pod的客户端提供访问pod方法,及客户端访问pod入口
  • Service通过pod标签与pod进行关联

3、Service类型

  • ClusterIp
    • 默认,分配一个集群内部可以访问的虚拟IP
  • NodePort
    • 在每个Node上分配一个端口作为外部访问入口
  • LoadBalancer
    • 工作在特定的Cloud Provide上,例如Google Cloud。AWS,OpenStack
  • ExternalName
    • 表示把集群外部的服务引入到集群内部中来,即实现了集群内部pod和集群外部的服务进行通信

4、Service参数

  • port:访问service使用的端口
  • targetPort:Pod中容器端口
  • NodePort:通过Node实现外网用户访问k8s集群内service(30000-3267)

5、Service创建

5.1、通过命令行创建

  • 默认创建Service为ClusterIP类型
  • 创建Service与Deployment类型应用关联
kubectl expose deployment.apps nginx-app --type=ClusterIP --target-port=80 --port=80

说明
expose 创建service
deployment.apps 控制器类型
nginx-app 应用名称,也是service名称
--type=ClusterIP 指定service类型
--target-port=80 指定pod中容器端口
--port=80 指定service端口

5.2、通过资源清单创建

  • 编写用于创建Service资源清单文件(04-create-deployment-service-clusterip.yaml)
apiVersion: v1
kind: Service
metadata:
  name: nginx-apps-svc
spec:
  type: ClusterIP
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  • 创建NodePort类型Service
apiVersion: v1
kind: Service
metadata:
  name: nginx-apps-svc
spec:
  type: NodePort
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
      nodePort: 30001
  • 验证NodePort端口
ss -anput | grep ":30090"

6、删除service

  • 通过命令行删除
# 查询
kubectl get service
或
kubectl get svc

# 删除
kubectl delete service nginx-apps-svc
  • 通过资源清单文件删除
kubectl delete -f 04-create-deployment-service-clusterip.yaml

八、ingress学习

1、Ingress 类型

  • 单服务 Ingress

单服务 Ingress 即该 Ingress 仅指定一个没有任何规则的后端服务。

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: screen-ingress
spec:
  backend:
    serviceName: rapid-screen-back
    servicePort: 8080
  • 多服务的 Ingress
    路由到多服务的 Ingress 即根据请求路径的不同转发到不同的后端服务上,比如
foo.bar.com -> 178.91.123.132 -> / foo    s1:80
                                 / bar    s2:80

可以通过下面的 Ingress 来定义

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test
spec:
  rules:
  - host: foo.bar.com
    http:
      paths:
      - path: /foo
        backend:
          serviceName: s1
          servicePort: 80
      - path: /bar
        backend:
          serviceName: s2
          servicePort: 80

九、ConfigMap使用

  • ConfigMap是一种API对象,用来将非加密数据保存到键值对中。可以用作环境变量、命令行参数或者存储卷中的配置文件。
  • ConfigMap就是为了让镜像和配置文件解耦,以便实现镜像的可移植性和可复用性,因为一个configMap其实就是一系列配置信息的集合,将来可直接注入到Pod中的容器使用,而注入方式有两种,一种将configMap做为存储卷,一种是将configMap通过env中configMapKeyRef注入到容器中

1、ConfigMap创建

  • 通过命令行创建
kubectl create configmap screen-config1 --from-literal=key1=hello --from-literal=key2=word
  • 通过yaml文件创建
apiVersion: v1
kind: ConfigMap
metadata:
  name: screen-config
data:
  key1: hello
  key2: world

2、ConfigMap的使用

Pod的使用方式:

  • 将ConfigMap中的数据设置为容器的环境变量
apiVersion: v1 
kind: Pod 
metadata: 
  name: pod1 
spec:
  containers: 
  - name: ngninx-pod 
    image: nginx:latest 
    ports: 
    - name: nginxport 
      containerPort: 80
    env:
    - name: KEY1
      valueFrom:
       configMapKeyRef:
        name: screen-config
        key: key1
    - name: KEY2
      valueFrom:
       configMapKeyRef:
        name: screen-config
        key: key2
  • 将ConfigMap中的数据设置为命令行参数
apiVersion: v1 
kind: Pod 
metadata: 
  name: pod1 
spec:
  containers: 
  - name: ngninx-pod 
    image: nginx:latest 
    ports: 
    - name: nginxport 
      containerPort: 80
    command: [ "/bin/sh","-c","echo $(KEY1) $(KEY2)"]
    env:
    - name: KEY1
      valueFrom:
       configMapKeyRef:
        name: screen-config
        key: key1
    - name: KEY2
      valueFrom:
       configMapKeyRef:
        name: screen-config
        key: key2

3、查看ConfigMap

kubectl get configmap

十、应用例子

  • 基础例子
apiVersion: v1
kind: Service
metadata:
  name: rapid-screen-back
spec:
  type: NodePort
  selector:
    app: screen
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 8080
      nodePort: 30001

---

apiVersion: apps/v1
kind: Deployment
metadata:
  name: rapid-screen-back
spec:
  replicas: 2
  selector:
    matchLabels:
      app: screen
  template:
    metadata:
      labels:
        app: screen
    spec:
      containers:
        - name: rapid-screen-back
          image: 192.168.3.12:6007/library/rapid-screen-back:v1.0.1
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 8080
  • 基础例子(命名空间、标签)
apiVersion: v1 
kind: Namespace 
metadata: 
  name: my-springboot 
  
---

apiVersion: v1
kind: Service
metadata:
  name: rapid-screen-back
  namespace: my-springboot
  labels:
    app: rapid-screen-back-svc
spec:
  type: NodePort
  selector:
    app: screen
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 8080
      nodePort: 30001

---

apiVersion: apps/v1
kind: Deployment
metadata:
  name: rapid-screen-back
  namespace: my-springboot
  labels:
    app: rapid-screen-back-dept
spec:
  replicas: 2
  selector:
    matchLabels:
      app: screen
  template:
    metadata:
      labels:
        app: screen
    spec:
      containers:
        - name: rapid-screen-back
          image: 192.168.3.12:6007/library/rapid-screen-back:v1.0.1
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 8080

十一、入门视频教程

  • k3s/k83学习有一定门槛,通过入门视频教程能够快速掌握基础知识,推荐大家学习
  • 百度网盘地址如下,推荐大家直接从第6章开始学习
链接:https://pan.baidu.com/s/101YH_l0DthYLvMX-5a69qA 
提取码:3faf
posted @ 2021-12-13 12:00  吕林光  阅读(2497)  评论(0编辑  收藏  举报