简单部署k8s及spring项目发布




前言


一、环境准备

三台服务器,操作系统centOS7

服务器配置:内存2GB+,CPU双核+,硬盘20GB+

服务器间网络互通

可连外网,需下载依赖

我搭建的时服务器地址如下

192.168.2.169 k8s-master

192.168.1.90 k8s-node1

192.168.2.170 k8s-node2



二、服务器准备(每台都需要)



1. 防火墙

        关闭防火墙

systemctl stop firewalld
    禁止防火墙开机自启
systemctl disable firewalld



2. selinux

        永久关闭

sed -i 's/enforcing/disabled/' /etc/selinux/config

        临时关闭

setenforce 0

3. swap分区

        永久关闭

sed -ri 's/.*swap.*/#&/' /etc/fstab

        临时关闭

swapoff -a

4. 设置主机名

#设置192.168.2.169
hostnamectl set-hostname k8s-master
#设置192.168.1.90
hostnamectl set-hostname k8s-node1
#设置192.168.2.170
hostnamectl set-hostname k8s-node2

5. 修改hosts

vi /etc/hosts 

192.168.2.169 k8s-master

192.168.1.90   k8s-node1

192.168.2.170 k8s-node2

6. iptables

#将各节点桥接的IPv4流量传递到iptables的链

#编辑k8s.conf文件
vi /etc/sysctl.d/k8s.conf 

#编辑内容如下
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0

#加载br_netfilter模块
modprobe br_netfilter

#查看是否加载
lsmod | grep br_netfilter

#生效
sysctl --system

7. 时间同步

#安装ntpdate
yum install ntpdate -y

#同步时间
ntpdate time.windows.com

8. 开启ipvs

#安装
yum -y install ipset ipvsadm

#在所有节点执行如下脚本

#编辑文件ipvs.modules
vi /etc/sysconfig/modules/ipvs.modules

#内容如下
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4

        授权、运行、检查是否加载

chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4

        检查是否加载

lsmod | grep -e ipvs -e nf_conntrack_ipv4

9. 重启

reboot

三、软件安装

1. docker相关

        设置开机启动

systemctl enable docker

        设置Docker镜像加速器

#创建配置文件路径
sudo mkdir -p /etc/docker

#修改daemon.json
vi /etc/docker/daemon.json

#内容如下
{
  "exec-opts": ["native.cgroupdriver=systemd"],	
  "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
}

#保存完,应用配置
sudo systemctl daemon-reload

#重启docker服务
sudo systemctl restart docker

        添加阿里云的YUM软件源

#编辑kubernetes.repo文件
vi /etc/yum.repos.d/kubernetes.repo

#内容如下
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg

2. 各服务器安装 kubeadm、kubelet和kubectl服务

        这里指定1.18.0版本,其他版本安装步骤类似

yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0

        为了实现Docker使用的cgroup drvier和kubelet使用的cgroup drver一致,建议修改"/etc/sysconfig/kubelet"文件的内容

vi /etc/sysconfig/kubelet

KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"

        设置为开机自启动即可,由于没有生成配置文件,集群初始化后自动启动

systemctl enable kubelet

3. 部署K8s

       

        master节点操作

        1.由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里需要指定阿里云镜像仓库地址

kubeadm init \
--apiserver-advertise-address=192.168.217.100 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.18.0 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16

        2.成功后,复制类似 kubeadm join 192.168.2.169:6443 --token tkvh20.ykj9ht2qavqrndlv \

--discovery-token-ca-cert-hash sha256:e56c4e70cac61255289cc62a81c742a5be3ee50364dd41bbc3dff4d015f3aa25

        

        3.根据提示信息,在Master节点上使用kubectl工具

#创建.kube文件夹
mkdir -p $HOME/.kube

#复制配置内容到.kube文件夹中
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

#
sudo chown $(id -u):$(id -g) $HOME/.kube/config

        4. 部署CNI网络插件

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

        查看部署CNI网络插件进度:(此处需等待全部完成)

kubectl get pods -n kube-system

        查询节点状态

kubectl get nodes

        查看集群健康状态:

kubectl get cs

        5.其他相关操作(不在部署环节中)

#查询节点信息
kubectl get nodes

#删除配置信息
kubeadm reset

#删除管理组件
yum erase -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0

#删除对应docker容器及镜像
docker rm / rmi  xxxxxx

        node节点操作

执行master节点生成的 kubeadm join 192.168.2.169:6443 --token tkvh20.ykj9ht2qavqrndlv \

--discovery-token-ca-cert-hash sha256:e56c4e70cac61255289cc62a81c742a5be3ee50364dd41bbc3dff4d015f3aa25

4.springboot项目部署前言

k8s部署spring项目,按我理解,首先需编写对应的部署yaml,因此需要优先生成spring项目的镜像。可以选择本地获取,也可以选择仓库获取(如dockerhub私人仓库,本地搭建harbor仓库),

本地获取则需要每台服务器都要预先存在镜像,因此,我们选择仓库获取,在部署前,先搭建harbor仓库。

5. harbor搭建

查看文章 harbor搭建

6. spring部署

        

        1. docker登录 harbor账户

# zxg.harbor.com:80 为harbor中配置的
docker login zxg.harbor.com:80
#输入账户 密码
xxxxxx  xxxx

        2. 查看./.docker/config.json

#将内容转成base64格式
cat .docker/config.json |base64 -w 0

        3. 编写 registry-secret.yaml 文件,进行注册harbor

apiVersion: v1
kind: Secret
metadata:
  name: cloud-registry #与下文中部署的yaml对应
  namespace: cloud #命名空间自行修改
data:
  .dockerconfigjson: 生成的base64
type: kubernetes.io/dockerconfigjson #固定为当前



#运行注册文件
kubectl create -f registry-secret.yaml

        4. 编写部署yaml文件

apiVersion: apps/v1
kind: Deployment
metadata:
  name: iov-cloud-gateway
  namespace: cloud
spec:
  replicas: 1
  selector:
    matchLabels:
      app: iov-cloud-gateway
  template:  #使用模板生成
    metadata:
      labels:
        app: iov-cloud-gateway
    spec:
      hostNetwork: true
      containers:
        - name: iov-cloud-gateway
        	#此处镜像地址为harbor上镜像地址
          image: xxxx  #harbor上的镜像名称+版本
          imagePullPolicy: IfNotPresent   #表示镜像来源,IfNotPresent本地没有就从hub仓库拉取,Never表示只从本地
          ports:
            - containerPort: 11000
          env:
            # 指定日志文件路径
            - name: logging.path
              value: /var/logs
      imagePullSecrets:
        - name: cloud-registry #加入此配置,表示读取上文中加入的配置,名字需要对应
---
apiVersion: v1
kind: Service
metadata:
  name: iov-cloud-gateway
  namespace: cloud
  labels:
    app: iov-cloud-gateway
spec:
  type: NodePort
  selector:
    app: iov-cloud-gateway
  ports:
    - name: http
      protocol: TCP
      port: 11000 #service(对内)的端口,不能与nodePort重复
      targetPort: 11000 #pod的端口
      nodePort: 11001 #service(对外)的端口,不能与port重复

        5. 运行配置文件

kubectl create -f 文件.yaml


#查看运行成的pods 日志
kubectl logs pod名称 -n 所属命名空间

#访问地址,地址为宿主机IP+nodePort
#nodePort:查看4.5中47行配置,service对外端口,命令查询
kubectl get pods,svc -n cloud

        6. 其他补充

                6.1 nodePort service对外端口范围修改

# 编辑  kube-apiserver.yaml 文件
vim /etc/kubernetes/manifests/kube-apiserver.yaml
# 加入以下内容到 --service-cluster-ip-range 下面一行
- --service-node-port-range=1-65535
# 应用配置
systemctl daemon-reload
# 重启kubectl
systemctl restart kubelet




总结

本文仅作个人学习累积,以便回顾

### 回答1: 当在 Kubernetes 上部署 Spring Cloud 项目时,您需要考虑以下几个方面: 1. 容器化应用程序:您需要将 Spring Cloud 项目打包为 Docker 镜像,以便在 Kubernetes 上运行。确保您的应用程序容器化,并将其上传到 Docker 镜像仓库。 2. 部署:您需要使用 Kubernetes 部署资源(如 Deployment、StatefulSet 或 DaemonSet)来部署应用程序。确保您的 Kubernetes 部署资源中包含正确的容器映像和应用程序配置信息。 3. 服务发现和负载均衡:使用 Kubernetes 中的服务资源来公开您的应用程序,并使用 Ingress 控制器实现路由。您可以使用 Spring Cloud Kubernetes 提供的 Kubernetes 服务发现客户端来访问 Kubernetes 服务。 4. 配置管理:使用 Kubernetes ConfigMap 和 Secret 资源管理应用程序配置和密钥。您可以使用 Spring Cloud Kubernetes Config 提供的配置客户端来访问这些配置。 5. 监控和日志记录:在 Kubernetes 上运行 Spring Cloud 项目时,您需要使用 Kubernetes 的监控和日志记录工具来跟踪应用程序的健康状况和行为。您可以使用 Prometheus 和 Grafana 来监控应用程序的度量标准,并使用 Fluentd 或 Elasticsearch 来收集和分析日志数据。 这些是在 Kubernetes 上部署 Spring Cloud 项目时需要考虑的一些方面。希望对您有所帮助! ### 回答2: K8s(Kubernetes)是一个可扩展、自动化的容器编排系统,它在部署、扩展、管理和自动化容器化应用程序方面提供了极大的帮助。SpringCloud是一种分布式微服务框架,它为开发者提供了一整套分布式解决方案。在使用K8s部署SpringCloud项目时,我们需要以下步骤: 第一步:准备Docker镜像 我们需要在本地或在线上Docker里制作好我们项目的镜像,镜像可以在代码仓库里面写好镜像构建的步骤,也可以手动制作。如果手动制作,需要在本地安装Docker环境,然后运行Dockerfile进行构建。构建好后,将镜像推送至DockerHub或私有仓库。 第二步:在K8s部署 在使用K8s部署SpringCloud项目之前,需要先安装和配置K8s。然后,我们需要创建一个deployment对象,其中包含了我们的容器镜像信息、副本数、环境变量等信息。例如,我们有四个服务需要部署,可以通过以下方式: ``` apiVersion: apps/v1 kind: Deployment metadata: name: springcloud-deployment spec: selector: matchLabels: app: springcloud replicas: 4 template: metadata: labels: app: springcloud spec: containers: - name: service1 image: your-docker-image1 ports: - containerPort: 8081 - name: service2 image: your-docker-image2 ports: - containerPort: 8082 - name: service3 image: your-docker-image3 ports: - containerPort: 8083 - name: service4 image: your-docker-image4 ports: - containerPort: 8084 ``` 第三步:创建Service对象 Service对象可以将Pod暴露给外部,以便于其他服务或客户端能够访问到。我们可以在创建Service对象时指定LB算法、端口、协议等信息。例如,在上面的deployment所创建的所有Pod中,我们可以创建一个Service对象,将它们对外暴露出来,供其他服务访问。可以通过以下方式创建: ``` apiVersion: v1 kind: Service metadata: name: springcloud-service spec: selector: app: springcloud type: LoadBalancer ports: - protocol: TCP port: 8080 targetPort: 8080 ``` 第四步:准备配置文件 SpringCloud模块中通常会有一些配置文件,例如application.properties,我们可以将它们放置在ConfigMap中,然后再将它们挂载到Pod中。这样一来,我们就可以在不重启Pod的情况下修改配置文件。例如,我们有一个configMap对象,可以通过以下方式创建: ``` apiVersion: v1 kind: ConfigMap metadata: name: springcloud-configmap data: application.properties: | db.url=jdbc:mysql://localhost:3306/mydb db.username=admin db.password=password ``` 第五步:使用Secret管理敏感信息 由于SpringCloud应用程序中通常包含敏感信息,例如数据库密码,我们需要在K8s中使用Secret对象来管理这些信息。我们可以将敏感信息编码后放置在Secret对象中,然后再将它们挂载到Pod中。这样一来,敏感信息就安全地存放在集群中,避免了泄漏。例如,我们有一个Secret对象,可以通过以下方式创建: ``` apiVersion: v1 kind: Secret metadata: name: springcloud-secret data: db.password: YWRtaW4= ``` 总结: 以上是在Kubernetes上部署Spring Cloud项目的步骤,K8s能够快速、高效地管理容器。在使用K8s部署应用时,需要按照最佳实践进行设置,以确保应用的正常运行和高可用性。同时,使用K8s还能够大大减少我们在应用部署管理方面的工作量,从而提高我们的工作效率。 ### 回答3: 1. 确认部署环境:k8s集群、Docker镜像仓库、Spring Cloud项目代码库。 2. 构建Docker镜像:将Spring Cloud项目打包成Docker镜像并上传至Docker镜像仓库。可以使用maven插件或Dockerfile来构建镜像。 3. 配置k8s部署文件:在k8s中编写部署文件,包括Deployment、Service和Ingress等资源的配置。Deployment用于定义Pod的副本数和容器镜像等信息,Service用于定义Pod之间的网络互通,Ingress用于定义外部访问路由。 4. 部署Spring Cloud项目:使用kubectl apply命令将部署文件提交至k8s进行部署。可以使用kubectl get命令来查看部署的状态和日志。 5. 配置服务发现与负载均衡:使用k8s的Service对象进行服务发现和负载均衡。可以使用kubectl describe命令来查看Service对象的IP和端口信息。 6. 配置外部访问路由:使用k8s的Ingress对象进行外部访问路由的配置。可以使用kubectl describe命令来查看Ingress对象的IP和端口信息。 7. 监控与日志收集:使用k8s自带的监控工具和日志收集工具进行监控和日志收集。可以使用kubectl logs和kubectl exec命令来查看Pod的日志和进行进程操作。 8. 自动化部署与运维:可以使用持续集成工具如Jenkins和GitLab来实现自动化部署和运维。可以使用k8s的API和命令行工具来进行自动化操作。 总之,利用k8s进行Spring Cloud项目部署可以实现高可用、弹性伸缩、自动化部署等优势。但需要注意的是,k8s部署需要一定的技术水平和实践经验,建议在熟悉k8s之后再进行相关操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值