基于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"
- 配置完成后即可启动测试