Kubernetes(K8s) 入门篇

1,134 阅读8分钟

Kubernetes(K8s)

1. What is Kubernetes?

部署容器化应用,可以对dorker容器进行编排

2. Kubernetes 架构

用户 -》 主节点 -》 从节点

k8s构成:

  • master

    • API Server 所有请求的唯一入口

    • Etcd 存储集群数据,自动服务发现3个

    • controller-manager pod管理

      pod 有有状态 无状态 需要持久化数据

    • sheduler 调度器 调度资源确认部署在Node

  • nodes

    • kubelet master在node 上的代理,api下发任务,kubelet管理node调度管理pod
    • kube-proxy 在node实现pod网络代理
    • container runtime 容器引擎

k8s.jpg

pod 是短暂的 controller确定pod数量

service 防止pod失联

pollcies 策略

labels 标签

namespaces 命名空间 隔离作用

3.安装k8s

服务器硬件配置要求

  • 在开始部署k8s集群之前,服务器需要满足以下条件:
  • 1️⃣一台或多台服务器,操作系统CentOS 7.x-86_x64。
  • 2️⃣硬盘配置:内存2GB或更多,CPU2核或更多,硬盘30GB或更多。
  • 3️⃣集群中的所有机器之间网络互通。
  • 4️⃣可以访问外网,需要拉取镜像。
  • 5️⃣禁止swap分区。

部署 Kubernetes 环境(集群)主要有多种方式:

(1)minikube

minikube可以在本地运行Kubernetes的工具,minikube可以在个人计算机(包括Windows,macOS和Linux PC)上运行一个单节点Kubernetes集群,以便您可以试用Kubernetes或进行日常开发工作;

kubernetes.io/docs/tutori…

(2)kind

Kind和minikube类似的工具,让你在本地计算机上运行Kubernetes,此工具需要安装并配置Docker;

kind.sigs.k8s.io/

(3)kubeadm

Kubeadm是一个K8s部署工具,提供kubeadm init 和 kubeadm join两个操作命令,可以快速部署一个Kubernetes集群;

官方地址:

kubernetes.io/docs/refere…

kubernetes.io/docs/setup/…

(4)二进制包

从Github下载发行版的二进制包,手动部署安装每个组件,组成Kubernetes集群,步骤比较繁琐,但是能让你对各个组件有更清晰的认识;

(5)yum安装

通过yum安装Kubernetes的每个组件,组成Kubernetes集群,不过yum源里面的k8s版本已经比较老了,所以这种方式用得也比较少了;

(6)第三方工具

有一些大神封装了一些工具,利用这些工具进行k8s环境的安装;

(7)花钱购买

直接购买类似阿里云这样的公有云平台k8s,一键搞定;

Kubeadm部署Kubernetes

kubeadm是官方社区推出的一个用于快速部署 kubernetes 集群的工具,这个工具能通过两条指令完成一个kubernetes集群的部署;

1、创建一个Master节点:

kubeadm init

2、将Node节点加入到Master集群中:

$ kubeadm join <Master节点的IP和端口>

# 关闭防火墙
​
systemctl stop firewalld
​
systemctl disable firewalld
​
# 关闭selinux
​
sed -i 's/enforcing/disabled/' /etc/selinux/config #永久
​
setenforce 0 #临时# 关闭swap(k8s禁止虚拟内存以提高性能)
​
sed -ri 's/.*swap.*/#&/' /etc/fstab #永久
​
swapoff -a #临时# 在master添加hostscat >> /etc/hosts << EOF
​
192.168.172.134 k8smaster
​
192.168.172.135 k8snode
​
# 设置网桥参数
​
cat > /etc/sysctl.d/k8s.conf << EOF
​
net.bridge.bridge-nf-call-ip6tables = 1
​
net.bridge.bridge-nf-call-iptables = 1
​
sysctl --system #生效# 时间同步
​
yum install ntpdate -y
​
ntpdate time.windows.com

4. 使用k8s部署docker

步骤:

  • 程序打包 maven - > jar
  • 使用dokerFile 制作生成docker镜像 ,上传到远程镜像仓库 push
  • k8s拉取镜像,运行容器,设置对外暴露端口

eg:

# 打包
# 制作镜像
# 拉取启动
kubectl create deployment nginx --image=nginx:lastest
# 暴露端口 之后可以查看Service
kubectl expose deployment nginx --port=80 --type=NodePort
# 访问
kubectl get deployment
kubectl delete deployment nginx 删除控制器
​
kubectl get pod(s)
kubectl delete pod nginx~
kubectl get service(s)
​
kubectl --help
​
# 空运行
kubectl create deployment springboot-jar --dry-run -o yaml > boot-delpoy.yaml
# 会生成yaml 文件# 通过yml文件部署(清单)
kubectl apply -f boot-deploy.yaml

5.图形化界面

  • 下载镜像
  • 部署
  • 创建账号
  • 绑定权限
  • 获取token

6. yml 配置详解

# 【必须】版本号
apiVersion: v1 
# 【必选】Pod
kind: Pod 
# 【必选-Object】元数据
metadata: 
  # 【必选】 Pod的名称
  name: String 
  # 【必选】 Pod所属的命名空间
  namespace: String 
  # 【List】 自定义标签列表
  labels: 
    - name: String
  # 【List】 自定义注解列表
  annotations: 
    - name: String
# 【必选-Object】 Pod中容器的详细定义
spec:
  # 【必选-List】 Pod中容器的详细定义
  containers: 
    # 【必选】 容器的名称
    - name: String
      # 【必选】 容器的镜像名称
      image: String 
      # 【String】 每次都尝试重新拉取镜像 | 仅使用本地镜像 | 如果本地有镜像则使用,没有则拉取
      imagePullPolicy: [Always | Never | IfNotPresent] 
      # 【List】 容器的启动命令列表,如果不指定,则使用镜像打包时使用的启动命令
      command: [String]
      # 【List】 容器的启动命令参数列表
      args: [String]
      # 容器的工作目录
      workingDir: String 
      # 【List】 挂载到容器内部的存储卷配置
      volumeMounts: 
        # 引用Pod定义的共享存储卷的名称,需使用volumes[]部分定义的共享存储卷名称
        - name: String 
          # 存储卷在容器内mount的绝对路径,应少于512个字符
          mountPath: Sting 
          # 是否为只读模式,默认为读写模式
          readOnly: Boolean
      # 【List】 容器需要暴露的端口号列表
      ports:
        # 端口的名称
        - name: String  
          # 容器需要监听的端口号
          containerPort: Int 
          # 容器所在主机需要监听的端口号,默认与containerPort相同。设置hostPort时,同一台宿主机将无法启动该容器的第二份副本
          hostPort: Int 
          # 端口协议,支持TCP和UDP,默认值为TCP
          protocol: String
      # 【List】 容器运行前需设置的环境变量列表
      env: 
        # 环境变量的名称
        - name: String 
          # 环境变量的值
          value: String 
      # 【Object】 资源限制和资源请求的设置
      resources:
        # 【Object】 资源限制的设置
        limits: 
          # CPU限制,单位为core数,将用于docker run --cpu-shares参数
          cpu: String 
          # 内存限制,单位可以为MB,GB等,将用于docker run --memory参数
          memory: String 
        # 【Object】 资源限制的设置
        requests: 
          # cpu请求,单位为core数,容器启动的初始可用数量
          cpu: String 
          # 内存请求,单位可以为MB,GB等,容器启动的初始可用数量
          memory: String 
      # 【Object】 对Pod内各容器健康检查的设置,当探测无响应几次之后,系统将自动重启该容器。可以设置的方法包括:exec、httpGet和tcpSocket。对一个容器只需要设置一种健康检查的方法
      livenessProbe: 
        exec: # 【Object】 对Pod内各容器健康检查的设置,exec方式
          command: [String] # exec方式需要指定的命令或者脚本
        httpGet: # 【Object】 对Pod内各容器健康检查的设置,HTTGet方式。需要指定path、port
          path: String
          port: Number
          host: String
          scheme: String
          httpHeaders:
            - name: String
              value: String
        tcpSocket: # 【Object】 对Pod内各容器健康检查的设置,tcpSocket方式
          port: Number
        # 容器启动完成后首次探测的时间,单位为s
        initialDelaySeconds: Number 
        # 对容器健康检查的探测等待响应的超时时间设置,单位为s,默认值为1s。若超过该超时时间设置,则将认为该容器不健康,会重启该容器。
        timeoutSeconds: Number  
        # 对容器健康检查的定期探测时间设置,单位为s,默认10s探测一次
        periodSeconds: Number 
        successThreshold: 0
        failureThreshold: 0
      securityContext:
        privileged: Boolean
  # Pod的重启策略 一旦终止运行,都将重启 | 终止后kubelet将报告给master,不会重启 | 只有Pod以非零退出码终止时,kubelet才会重启该容器。如果容器正常终止(退出码为0),则不会重启。
  restartPolicy: [Always | Never | OnFailure] 
  # 设置Node的Label,以key:value格式指定,Pod将被调度到具有这些Label的Node上
  nodeSelector: object 
  # 【Object】 pull镜像时使用的Secret名称,以name:secretkey格式指定
  imagePullSecrets: 
    - name: String
  # 是否使用主机网络模式,默认值为false。设置为true表示容器使用宿主机网络,不再使用docker网桥,该Pod将无法在同一台宿主机上启动第二个副本
  hostNetwork: Boolean 
  # 【List】 在该Pod上定义的共享存储卷列表
  volumes: 
    # 共享存储卷的名称,volume的类型有很多emptyDir,hostPath,secret,nfs,glusterfs,cephfs,configMap
    - name: String 
      # 【Object】 类型为emptyDir的存储卷,表示与Pod同生命周期的一个临时目录,其值为一个空对象:emptyDir: {}
      emptyDir: {} 
      # 【Object】 类型为hostPath的存储卷,表示挂载Pod所在宿主机的目录
      hostPath: 
        # Pod所在主机的目录,将被用于容器中mount的目录
        path: String 
      # 【Object】类型为secret的存储卷,表示挂载集群预定义的secret对象到容器内部
      secret: 
        secretName: String
        items:
          - key: String
            path: String
      # 【Object】 类型为configMap的存储卷,表示挂载集群预定义的configMap对象到容器内部
      configMap: 
        name: String
        items:
          - key: String
            path: String

7. 端口暴露Ingress

k8s应用结构:

  • ingress

    • a.com

      • service

        • pod
        • pod
        • pod
    • b.com

      • service

        • pod
        • pod
        • pod
    • c.com

      • service

        • pod
        • pod
        • pod

k8s 集群内部pod,service都有自己的IP但是无法提供外网访问

可以通过NodePort的方式暴露服务,但不灵活

生产中: Ingress 相当于集群网关,不是k8s自带的,可以通过ingress-nginx

  1. 安装Ingress Nginx
  2. 配置规则

8 部署微服务项目

  1. 项目本身打jar包或war

  2. 制作镜像(Dockerfile文件)

    FROM jdk1.8.0_251
    MAINTAINER zhj
    ADD spring-cloud-alibaba-gateway-1.0.0.jar /opt
    RUN chmod +x /opt/spring-cloud-alibaba-gateway-1.0.0.jar
    CMD java -jar /opt/spring-cloud-alibaba-gateway-1.0.0.jar
    

    docker build -t spring-cloud-alibaba-gateway-1.0.0 -f Dockerfile-gateway .

    构建镜像

    docker build -t {镜像名} -f {Dokerfile文件名} .

  3. k8s 部署服务

    (1)

    kubectl create deployment spring-cloud-alibaba-gateway --image=spring-cloud-alibaba-gateway-1.0.0 --dry-run -o yaml > gateway-delpoy.yaml
    

    从本地获取镜像需要在 gateway-delpoy.yaml中配置

    containers:

    -image: spring-cloud-alibaba-gateway-1.0.0

    imagePullPolicy: Never # 不拉取

    (2)

    kubectl apply -f gateway-delpoy.yaml

    可以支持快速扩容

  4. k8s 暴露服务

    kubectl expose deployment spring-cloud-alibaba-gateway --port=8080 --target-port = 8080 --type=NodePort

    target-port 代表程序运行时使用的端口(代码)

    port 容器对外的端口(容器之间访问的端口)

    node-port 代表服务器对外暴露的端口 一般都是30000+的

  5. kubectl logs -f {pod名 } # 查看日志

  6. 配置ingress-nginx 绑定域名

k8s适用于无状态服务,有状态服务适合单独部署

有状态数据库,配置中心,注册中心