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

基于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
    在这里插入图片描述
  • 组件选择:选择Service Binaries中的 kubernetes-server-linux-amd64.tar.gz 该文件已经包含了 K8S所需要的全部组件,无需单独下载Client等组件
    在这里插入图片描述
安装规划
  • 解压压缩包,将二进制文件(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 是否正确启动
      [root@china-f18247202 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 已经成功注册并状态为可用
      [root@china-f18247202 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 命令查看镜像列表

[root@china-f18247202 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"]
[root@china-f18247202 docker]# docker build -t dome .
...
[root@china-f18247202 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 文件,
[root@china-f18247202 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
[root@china-f18247202 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;查看创建状态及详情
[root@china-f18247202 docker]# kubectl create -f demo-pod.yaml
...
[root@china-f18247202 docker]# kubectl get po
NAME   READY   STATUS    RESTARTS   AGE
demo   1/1     Running   0          26h
[root@china-f18247202 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>

[root@china-f18247202 docker]# kubectl create -f demo-svc.yaml
...
[root@china-f18247202 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
[root@china-f18247202 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 命令查看部署是否成功
[root@china-f18247202 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"
    
  • 配置完成后即可启动测试
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值