欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

基于Kubernetes单机安装、部署SpringBoot、集群部署

程序员文章站 2022-07-13 21:26:52
...

基于Kubernetes单机安装、部署SpringBoot、集群部署

基于Kubernetes单机安装、部署SpringBoot

kubernetes是容器编排器,单机二进制文件方式安装、离线安装版本及环境

  • Centos7
  • kubernetes 1.13版
  • docker 18.09.3版
准备阶段
  • 禁用防火墙
systemctl stop firewalld
systemctl disable firewalld
  • 禁用SELinux(影响docker的使用)
# 打开selinux文件
vi /etc/sysconfig/selinux

# 修改SELINUX
SELINUX=disabled
  • 关闭swap内存
swapoff -a
k8s的安装
  • 下载kubernetes(简称K8S)二进制文件 https://github.com/kubernetes/kubernetes/releases
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GTjnKvKw-1579059294604)(/image/c00ccd5b-46ed-4d81-8383-1b7ff220d461)]

  • 组件选择:选择Service Binaries中的 kubernetes-server-linux-amd64.tar.gz 该文件已经包含了 K8S所需要的全部组件,无需单独下载Client等组件
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cYB8qJUc-1579059294605)(/image/9114f0bb-34c9-4e6f-8384-90f1b3916e30)]

安装规划
  • 解压压缩包,将二进制文件(etcd、etcdctl、kube-apiserver、kube-controller-manager、kube-scheduler、kubelet、kubectl、kube-proxy)复制到/usr/bin目录下
  • Master 服务
    • etcd服务

      • etcd服务是作为kubernetes集群的主数据库,在安装kubernetes各服务之前需要首先安装和启动
      • 设置 systemd 服务文件 /usr/lib/systemd/system/etcd.service
        • WorkingDirectory(/var/lib/etcd)表示etcd数据保存的目录,需要在启动etcd服务之前进行创建
      [Unit]
      Description=etcd.service
      After=network.target
      
      
      [Service]
      Type=simple
      #TimeoutStartSec=0
      #Restart=always
      WorkingDirectory=/var/lib/etcd
      EnvironmentFile=-/etc/etcd/etcd.conf
      ExecStart=/usr/bin/etcd
      
      
      [Install]
      WantedBy=multi-user.target
      
      • 配置文件 /etc/etcd/etcd.conf ,etcd默认将监听在 http://127.0.0.1:2379 地址供客户连接
      ETCD_NAME=ETCD ServerETCD_DATA_DIR="/var/lib/etcd/"ETCD_LISTEN_CLIENT_URLS = "http://127.0.0.1:2379"ETCD_ADVERTISE_CLIENT_URLS="http://127.0.0.1:23
      
      • 配置完成,通过 systemctl staart 命令启动 etcd 服务;可以使用 systemctl enable 命令将服务加入开机启动列表中
      systemctl daemon-reload
      systemctl enable etcd.service
      systemctl start etcd.service
      
      • 通过执行 etcdctl cluster-health,可以验证 etcd 是否正确启动
      [[email protected] system]# etcdctl cluster-health
      member 8e9e05c52164694d is healthy: got healthy result from http://127.0.0.1:2379cluster is healthy
      
    • kube-apiserver服务

      • kube-apiserver服务提供了 HTTP Rest 接口的关键服务进程,是 Kubernetes 里所有资源的增、删、改、查等操作的唯一入口,也是集群控制的入口进程
      • 编辑 systemd 服务文件 /usr/lib/systemd/system/kube-apiserver.service
      [Unit]
      Description=Kubernetes API Server
      Documentation=https://github.com/GoogleCloudPlatform/kubernetes
      After=etcd.service
      Wants=etcd.service
      
      
      [Service]
      EnvironmentFile=/etc/kubernetes/apiserver
      ExecStart=/usr/bin/kube-apiserver $KUBE_API_ARGS
      Restart=on-failure
      Type=notify
      LimitNOFILE=65536
      
      
      [Install]
      WantedBy=multi-user.target
      
      • 配置文件 /etc/kubernetes/apiserver 内容包含了 kube-apiserver 的全部启动参数,主要的配置参数在变量 KUBE_API_ARGS 中指定
        • –admission-control 中的 ServiceAccount 暂时不设,该参数是 Servjce 令牌校验,暂时不使用;会影响 kubelet 启动 svc
      KUBE_API_ARGS="--storage-backend=etcd3 --etcd-servers=http://127.0.0.1:2379 --insecure-bind-address=0.0.0.0 --insecure-port=8080 --service-cluster-ip-range=127.0.0.0/16 --service-node-port-range=1-65535 --admission-control=NamespaceLifecycle,LimitRanger,PersistentVolumeLabel,DefaultStorageClass,ResourceQuota,DefaultTolerationSeconds --logtostderr=false --log-dir=/var/log/kubernetes --v=2"
      
      • 启动参数说明

        • –etcd-servers:指定 etcd 服务的 URL
        • –storage-backend:指定 etcd的版本,从 kubernetes v1.6开始,默认为 etcd3;kubernetes v1.6以前没有此参数,kube-apiserver默认使用etcd2
        • –insecure-bind-apiserver:绑定主机的非安全 IP 地址,设置 0.0.0.0 表示绑定所有 IP
        • –insecure-port:apiserver绑定主句的非安全 IP 地址,默认为 8080
        • –service-cluster-ip-range:kubernetes集群中 Service 的虚拟 IP 地址段范围,以 CIDR 是表示,例如 169.169.0.0/16,该 IP 范围不能与物理机的真实 IP 段有重合
        • –service-node-port-range:kubernetes集群中 Service 可映射的物理机端口号范围,默认 30000~32767
        • –admission-control:kubernetes 集群的准入控制设置,各控制模块以插件的形式依次生效
        • –logtostderr:设置为 false 表示将日志写入文件,不写入stderr
        • –log-dir:日志目录
          —v:日志级别
    • kube-controller-manager服务

      • kube-controller-manager服务是 kubernetes 中所有资源对象的自动化控制中心
      • kube-controller-manager 服务依赖于 kube-apiserver 服务
      • 编辑 systemd 服务文件 /usr/lib/systemd/system/kube-controller-manager.service;
      [Unit]
      Description=Kubernetes Controller Manager
      Documentation=https://github.com/GoogleCloudPlatform/kubernetes
      After=kube-apiserver.service
      Requires=kube-apiserver.service
      
      
      [Service]
      EnvironmentFile=/etc/kubernetes/controller-manager
      ExecStart=/usr/bin/kube-controller-manager $KUBE_CONTROLLER_MANAGER_ARGS
      Restart=on-failure
      LimitNOFILE=65536
      
      
      [Install]
      WantedBy=multi-user.target
      
      • 配置文件 /etc/kubernetes/controller-manager 内容包含了 kube-controller-manager 的全部启动参数,主要的配置参数在变量 KUBE_APICONTROLLER_MANAGER_ARGS 中指定
      KUBE_CONTROLLER_MANAGER_ARGS="--master=http://0.0.0.0:8080 --logtostderr=false --log-dir=/vat/log/kubernetes --v=2"
      
      • 启动参数说明

        • –master:指定 apiserver 的URL地址
        • –logtostderr:设置为 false 表示将日志写入文件,不写入 stderr
        • –log-dir:日志目录
        • –v:日志级别
    • kube-scheduler服务

      • kube-scheduler 服务负责资源调度(Pod调度)的进程
      • kube-scheduler 服务依赖于 kube-apiserver 服务
      • 编辑 systemd 服务文件 /usr/lib/systemd/system/kube-scheduler.service;
      [Unit]
      Description=Kubernetes Scheduler
      Documentation=https://github.com/GoogleCloudPlatform/kubernetes
      After=kube-apiserver.service
      Requires=kube-apiserver.service
      
      
      [Service]
      EnvironmentFile=/etc/kubernetes/scheduler
      ExecStart=/usr/bin/kube-scheduler $KUBE_SCHEDULER_ARGS
      Restart=on-failure
      LimitNOFILE=65536
      
      
      [Install]
      WantedBy=multi-user.target
      
      • 配置文件 /etc/kubernetes/scheduler 内容包含了 kube-scheduler 的全部启动参数,主要的配置参数在变量 KUBE_SCHEDULER_ARGS 中指定
      KUBE_SCHEDULER_ARGS="--master=http://0.0.0.0:8080 --logtostderr=false --log-dir=/var/log/kubernetes --v=2"
      
      • 启动参数说明
        • –master:指定 apiserver 的URL地址
        • –logtostderr:设置为 false 表示将日志写入文件,不写入 stderr
          —log-dir:日志目录
        • –v:日志级别
          *- 配置完成后,执行 systemctl start 命令按顺序启动 kube-apiserver、kube-controller-manager、kube-scheduler 这三个服务,可使用 systemctl enable 命令将服务加入开机启动列表
      systemctl daemon-reload
      systemctl enable kube-apiserver
      systemctl start kube-apiserver
      systemctl enable kube-controller-manager
      systemctl start kube-controller-manager
      systemctl enable kube-scheduler
      systemctl start kube-scheduler
      
      • 通过 systemctl status <service_name> 来验证服务的启动状态,“running”表示启动成功,以上是 Master 所需的服务
    • Node 服务

      • docker 服务

        • docker 是一个开源的应用容器引擎,基于 Go语言 并遵从 Apache2.0 协议开源;可以让开发者打包应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器中,也可以以实现虚拟化

        • 移除旧版本

        sudo yum remove docker \
        				docker-client \
        				docker-client-latest \
        				docker-common \
        				docker-latest \
        				docker-latest-logrotate \
        				docker-logrotate \
        				docker-selinux \
        				docker-engine-selinux \
        				docker-engine
        
        • 安装必要系统工具
        sudo yum install -y yum-utils device-mapper-persistent-data lvm2
        
        • 添加软件源信息
        sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
        
        • 更新 yum 缓存
        sudo yum makecache fast
        
        • 安装 Docker-ce
        sudo yum -y install docker-ce
        
        • 镜像加速,在 /etc/docker 下找到 daemon.json 文件(没有自行创建)添加镜像加速地址
        {
          "registry-mirrors": [ "https://registry.docker-cn.com"]
        }
        
        • 启动 Docker 后台服务
        sudo systemctl start docker
        
        • 测试运行 hello-world(本地没有 hello-world 镜像,docker会下载一个 hello-world 镜像并在容器里运行)
        docker run hello-world
        

        [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tDJjJ89W-1579059294606)(/image/7bfd53be-aaf7-4aa4-82fc-f6c85fc38f30)]

      • kubelet 服务

        • kubelet 服务负责 Pod 对应的容器的创建、启停等任务,同时与 Master 节点密切协议,实现集群管理的基本功能

        • kubelet 服务依赖于 Docker 服务

        • 设置 systemd 服务文件 /usr/lib/systemd/system/kubelet.service

          • WorkingDirectory(/var/lib/kubelet)表示 kubelet 保存数据的目录,需要在启动 kubelet 服务之前进行创建
        [Unit]
        Description=Kubernetes Kubelet Server
        Documentation=https://github.com/GoogleCloudPlatform/kubernetes
        After=docker.service
        Requires=docker.service
        
        
        [Service]
        WorkingDirectory=/var/lib/kubelet
        EnvironmentFile=/etc/kubernetes/kubelet
        ExecStart=/usr/bin/kubelet $KUBELET_ARGS
        Restart=on-failure
        
        
        [Install]
        WantedBy=multi-user.target
        
        • 配置文件 /etc/kubernetes/kubelet 内容包含了 kubelet 的全部启动参数,主要的配置参数在变量 KUBELET_ARGS 中指定
        KUBELET_ARGS="--pod-infra-container-image=hub.c.163.com/k8s163/pause-amd64:3.0 --hostname-override=0.0.0.0 --port=10250 --address=0.0.0.0 --v=2 --logtostderr=false --kubeconfig=/etc/kubernetes/kubelet.kubeconfig --fail-swap-on=false --cluster-dns=10.0.2.255 --cluster-domain=cluster.local. --serialize-image-pulls=false"
        
        • 配置 kubelet.kubeconfig 文件
        apiVersion: v1
        kind: Config
        clusters:
          - cluster:
        	  server: http://0.0.0.0:8080/
        	name: local
        contexts:
          - context:
        	  cluster: local
        	name: local
        current-context: local
        
      • kube-proxy 服务

        • kube-proxy 服务实现 kubernetes service 的通信与负载均衡机制的重要组件
        • kubelet 服务依赖于 network 服务
        • 设置 systemd 服务文件 /usr/lib/systemd/system/kube-proxy.service
        [Unit]
        Description=Kubernetes Kube-Proxy Server
        Documentation=https://github.com/kubernetes/kubernetes
        After=network.target
        
        
        [Service]
        EnvironmentFile=/etc/kubernetes/proxy
        ExecStart=/usr/bin/kube-proxy $KUBE_ARGS
        Restart=on-failure
        LimitNOFILE=65536
        
        
        [Install]
        WantedBy=multi-user.target
        
        • 配置文件 /etc/kubernetes/kube-proxy 内容包含了 kube-proxy 的全部启动参数,主要的配置参数在变量 KUBE_PROXY_ARGS 中指定
        KUBE_ARGS="--v=2 --master=http://0.0.0.0:8080 --logtostderr=false --log-dir=/var/log/kubernetes --bind-address=0.0.0.0 --hostname-override=0.0.0.0 --cluster-cidr=0.0.0.0/16"
        
      • 配置完成后,通过 systemctl 启动 kubelet 和 kube-proxy 服务

      systemctl daemon-reload
      systemctl enable kubelet
      systemctl start kubelet
      systemctl enable kube-proxy
      systemctl start kube-proxy
      
      • kubelet 默认采用向 Master 自动注册本 Node 的机制,在 Master 上查看各 Node 的状态,状态为 Ready 表示 Node 已经成功注册并状态为可用
      [[email protected] kubernetes]# kubectl get nodes
      NAME                         STATUS     ROLES    AGE     VERSION
      0.0.0.0                      Ready      <none>   5d22h   v1.13.0-beta.2
      china-f18247202.ygsoft.com   NotReady   <none>   5d23h   v1.13.0-beta.2
      
创建Pod、Service资源对象来部署Docker容器应用
  • 创建Spring Boot项目,编写一个 Restful 接口
@RestController
public class HelloController {
     @GetMapping("/hello")
     public String hello() {
          return "Hello Docker World";
     }
}
  • 在Eclipse中选中项目右键,选择Run As,然后选择Maven build …,使用 clean install -X 进行打包
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xF9WGGQA-1579059294607)(/image/8109f6d4-e274-4911-82cf-9453ce9bacc7)]
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BTjlH841-1579059294607)(/image/83f94b48-9762-4866-8020-02c2f6387d72)]

  • 将打好的 jar 包上传至服务器;使用 docker build -t dome . 命令以 Dockerfile 文件将上传的 jar 包构建 Docker 本地镜像;构建完成使用 docker images 命令查看镜像列表

[[email protected] docker]# cat Dockerfile
FROM openjdk:8-jre-alpine
ENV APP_FILE hello-0.0.1-SNAPSHOT.jar
ENV APP_HOME /data/docker
EXPOSE 8088
COPY $APP_FILE $APP_HOME/
WORKDIR $APP_HOME
ENTRYPOINT ["sh", "-c"]
CMD ["exec java -jar $APP_FILE"]
[[email protected] docker]# docker build -t dome .
...
[[email protected] docker]# docker images
REPOSITORY                         TAG                 IMAGE ID            CREATED             SIZE
demo                               latest              76226bf7e611        30 hours ago        102MB
openjdk                            8-jre-alpine        1b46cc2ba839        5 weeks ago         85MB
ansible/centos7-ansible            latest              688353a31fde        2 years ago         447MB
hub.c.163.com/k8s163/pause-amd64   3.0                 99e59f495ffa        2 years ago         747kB
  • 编辑 demo-pod.yaml、demo-svc.yaml 文件,
[[email protected] docker]# cat demo-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: demo
labels:
  app: demo
spec:
  name:
  containers:
  - name: demo
    #镜像名
    image: demo
    #本地有镜像就不会去仓库拉取
    imagePullPolicy: Never
    ports:
      - containerPort: 8088
[[email protected] docker]# cat demo-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: demo
labels:
  app: demo
spec:
  type: NodePort
  ports:
  - port: 8088
    targetPort: 8088
    nodePort: 30001
  selector:
   app: demo
  • 创建 pod、svc;查看创建状态及详情
[[email protected] docker]# kubectl create -f demo-pod.yaml
...
[[email protected] docker]# kubectl get po
NAME   READY   STATUS    RESTARTS   AGE
demo   1/1     Running   0          26h
[[email protected] docker]# kubectl describe pod demo
Name:         demo
Namespace:    default
Node:         0.0.0.0/0.0.0.0
Start Time:   Wed, 13 Mar 2019 12:00:25 +0800
Labels:       app=demo
Annotations:  <none>
Status:       Running
IP:           172.17.0.2
Containers:
  demo:
    Container ID:   docker://2c4385425e2131789e31d39eff3e5322c4ae68cef32b290f8bb9f9e391ddc959
    Image:          demo
    Image ID:       docker://sha256:76226bf7e61106f28c3e481480b74986aa305b348f61b588528055c75b2d9ac9
    Port:           8088/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Wed, 13 Mar 2019 12:00:28 +0800
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:         <none>
Conditions:
  Type              Status
  Initialized       True
  Ready             True
  ContainersReady   True
  PodScheduled      True
Volumes:            <none>
QoS Class:          BestEffort
Node-Selectors:     <none>
Tolerations:        node.kubernetes.io/not-ready:NoExecute for 300s
                    node.kubernetes.io/unreachable:NoExecute for 300s
Events:             <none>

[[email protected] docker]# kubectl create -f demo-svc.yaml
...
[[email protected] docker]# kubectl get svc
NAME         TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)          AGE
demo         NodePort    127.0.64.29   <none>        8088:30001/TCP   26h
kubernetes   ClusterIP   127.0.0.1     <none>        443/TCP          9d
[[email protected] docker]# kubectl describe svc demo
Name:                     demo
Namespace:                default
Labels:                   app=demo
Annotations:              <none>
Selector:                 app=demo
Type:                     NodePort
IP:                       127.0.64.29
Port:                     <unset>  8088/TCP
TargetPort:               8088/TCP
NodePort:                 <unset>  30001/TCP
Endpoints:                172.17.0.2:8088
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>
  • 执行 curl ip:port 命令查看部署是否成功
[[email protected] docker]# curl 172.17.0.2:8088/hello
Hello Docker World

集群部署

准备阶段
  • 禁用防火墙
systemctl stop firewalld
systemctl disable firewalld
  • 禁用SELinux(影响docker的使用)
# 打开selinux文件
vi /etc/sysconfig/selinux

# 修改SELINUX
SELINUX=disabled
  • 关闭swap内存
swapoff -a
集群部署
  • 主节点部署跟单机部署方式一致,无需任何改变
  • 从节点部署修改部分
    • 配置文件 /etc/kubernetes/kubelet 修改hostname-override、address该为节点IP
    KUBELET_ARGS="--pod-infra-container-image=hub.c.163.com/k8s163/pause-amd64:3.0 --hostname-override=10.121.55.46 --port=10250 --address=10.121.55.46 --v=2 --logtostderr=false --kubeconfig=/etc/kubernetes/kubelet.kubeconfig --fail-swap-on=false --cluster-dns=10.0.2.255 --cluster-domain=cluster.local. --serialize-image-pulls=false"
    
    • 配置kubelet.kubeconfig文件,修改clusters.cluster.server的IP为节点IP
    apiVersion: v1
    kind: Config
    clusters:
      - cluster:
          server: http://10.121.55.46:8080/
      name: local
    contexts:
      - context:
          cluster: local
        name: local
    current-context: local
    
    • 配置文件 /etc/kubernetes/kube-proxy 修改master、bind-address、host-override、cluster-cidr的信息
    KUBE_ARGS="--v=2 --master=http://10.121.55.4:8080 --logtostderr=false --log-dir=/var/log/kubernetes --bind-address=10.121.55.46 --hostname-override=12.121.55.46 --cluster-cidr=10.121.55.0/16"
    
  • 配置完成后即可启动测试