✅创作者:陈书予
个人主页:陈书予的个人主页
陈书予的个人社区,欢迎你的加入: 陈书予的社区
在开始部署之前,必须先建立Kubernetes集群。为了简化部署过程,可以使用一些工具,如kubeadm
或kops
。
在系统上安装和配置Kubernetes master节点,可以按照以下步骤进行操作:
# 安装Docker
sudo apt-get install -y docker.io
# 添加Kubernetes的官方仓库
sudo curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
sudo apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"
# 安装Kubernetes
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
# 初始化master节点
sudo kubeadm init
# 在跟随的输出中,会看到需要执行以下命令来让Kubernetes集群管理器(kubectl)可以使用:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 添加Kubernetes网络插件
sudo kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
# 查看节点状态
sudo kubectl get nodes
# 输出应该类似于以下内容:
# NAME STATUS ROLES AGE VERSION
# Ready master 1m v1.10.0
在系统上安装和配置Kubernetes worker节点,可以按照以下步骤进行操作:
在1.1已安装的无需重复安装
)# 安装Docker
sudo apt-get install -y docker.io
# 添加Kubernetes的官方仓库
sudo curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
sudo apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"
# 安装Kubernetes
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
# 执行命令kubeadm init时,会提示你加入集群的命令
# 如:kubeadm join : --token --discovery-token-ca-cert-hash sha256:
在Kubernetes集群中,Pod之间需要能够相互通信。为了实现这个目标,必须配置Kubernetes网络。我们在上面初始化Kubernetes master节点的时候已经添加了Calico网络插件,这就能让Kubernetes集群正常工作了。
在Kubernetes集群中部署MySQL,可以按照以下步骤进行操作:
创建一个 Yaml 文件,命名为 mysql.yaml,内容如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
spec:
selector:
matchLabels:
app: mysql
strategy:
type: Recreate
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:5.6
env:
- name: MYSQL_ROOT_PASSWORD
value: password
restartPolicy: Always
这个配置文件定义了 MySQL 的 Deployment,指定了环境变量 MYSQL_ROOT_PASSWORD,指定了容器的镜像和重新启动策略。
kubectl apply -f mysql.yaml
kubectl get deployments
创建一个 Yaml 文件,命名为 mysql-resources.yaml,内容如下:
apiVersion: v1
kind: Pod
metadata:
name: mysql
spec:
containers:
- name: mysql
image: mysql:5.6
env:
- name: MYSQL_ROOT_PASSWORD
value: password
resources:
limits:
cpu: 500m
memory: 512Mi
requests:
cpu: 100m
memory: 256Mi
kubectl apply -f mysql-resources.yaml
kubectl get pods
这个配置文件指定了 MySQL Pod 的 CPU 和内存请求和限制。
创建一个 Yaml 文件,命名为 mysql-service.yaml,内容如下:
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
ports:
- port: 3306
targetPort: 3306
selector:
app: mysql
这个配置文件指定了 MySQL 的 Service 端口,并定义了选择器以将 Service 与 Deployment 关联起来。
kubectl apply -f mysql-service.yaml
kubectl get services
创建一个 Yaml 文件,命名为 mysql-pvc.yaml,内容如下:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
这个配置文件定义了一个 PersistentVolumeClaim(PVC),用于向 Kubernetes 集群申请一定数量的永久存储资源。
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-pv
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
hostPath:
path: "/mnt/data"
这个配置文件定义了一个 PersistentVolume(PV),用于提供永久存储资源。
kubectl apply -f mysql-pvc.yaml
kubectl apply -f mysql-pv.yaml
在完成以上操作后,你就成功的在 Kubernetes 集群中部署了 MySQL,包括创建 Deployment、Pod 的资源请求和限制、创建 Service 以及创建 PersistentVolume 和 PersistentVolumeClaim。
Nacos是一个服务注册和配置中心,它可以在Kubernetes集群中作为微服务架构的一部分被部署。下面是部署Nacos的步骤:
创建一个nacos-deployment.yaml文件,其中包含有关nacos deployment的定义。下面是一个示例文件:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nacos
spec:
replicas: 1
selector:
matchLabels:
app: nacos
template:
metadata:
labels:
app: nacos
spec:
containers:
- name: nacos
image: nacos/nacos-server:latest
env:
- name: MODE
value: standalone
ports:
- containerPort: 8848
- containerPort: 9555
上述yaml文件指定了deployment名称为nacos,使用了nacos官方提供的Docker镜像,并指定了容器的环境变量为standalone模式。此外,容器暴露了两个端口:8848用于服务注册和配置,9555用于健康检查。
kubectl apply -f nacos-deployment.yaml
编辑nacos-deployment.yaml文件,在nacos容器的部分添加以下内容:
resources:
requests:
cpu: 500m
memory: 1Gi
limits:
cpu: 1
memory: 2Gi
上述内容为nacos容器设置了资源请求和限制:请求了0.5个CPU和1GB内存,限制了1个CPU和2GB内存。
kubectl apply -f nacos-deployment.yaml
创建一个nacos-service.yaml文件,其中包含有关nacos service的定义。以下是一个示例文件:
apiVersion: v1
kind: Service
metadata:
name: nacos-service
spec:
selector:
app: nacos
ports:
- name: port1
port: 8848
- name: port2
port: 9555
上述yaml文件指定了service名称为nacos-service,并使用app=nacos标签来选择要关联的Pod。此外,service暴露了两个端口:8848端口用于服务注册和配置,9555端口用于健康检查。
kubectl apply -f nacos-service.yaml
创建一个nacos-pv.yaml文件,其中包含有关nacos persistent volume的定义。下面是一个示例文件:
apiVersion: v1
kind: PersistentVolume
metadata:
name: nacos-pv
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/mnt/data"
上述yaml文件指定了持久卷的名称为nacos-pv,容量为10GB,访问模式为ReadWriteOnce,使用的是hostPath卷类型。在这种类型下,使用主机节点上的路径作为数据存储的目录。
kubectl apply -f nacos-pv.yaml
创建一个nacos-pvc.yaml文件,其中包含有关nacos persistent volume claim的定义。以下是一个示例文件:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nacos-pv-claim
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
selector:
matchLabels:
pv-name: nacos-pv
上述yaml文件指定了基于nacos-pv持久卷创建的持久卷申请。此claim的名称为nacos-pv-claim,请求了10GB的存储空间,容许ReadWriteOnce访问模式,并使用了selector匹配nacos-pv的标签来关联persistent volume。
kubectl apply -f nacos-pvc.yaml
volumes:
- name: nacos-data
persistentVolumeClaim:
claimName: nacos-pv-claim
上述内容将名为nacos-data的持久卷声明添加到nacos容器中。
kubectl apply -f nacos-deployment.yaml
在 MySQL 中创建一个 Nacos 数据库,然后使用以下命令创建一个 config.txt 文件:
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://:/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=
db.password=
If use multi-datasource else to load data, you should set spring.jta.enabled=false,
and configure datasource in you business applications.
##spring.jta.enabled=false
config data id:
Nacos Configuration data
dataId: ${prefix}-${spring.profiles.active}.${file-extension}
prefix: /config
file-exetension: properties|yaml|yml|txt|xml ...
Nacos Configuration example:
dataId: example.${spring.profilex.active}.properties
content format:
user.name=Nacos
user.age=25
kubectl exec -it <nacos-pod-name> -- /bin/sh
curl -X POST "http://localhost:8848/nacos/v1/cs/configs?
dataId=mysql.properties&group=DEFAULT_GROUP&content=`cat /tmp/config.txt`"
以上命令将在 Nacos 的默认组中添加名为 mysql.properties 的配置文件。
在你的 Spring Boot 项目中添加以下依赖:
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
dependency>
在 application.properties 中添加以下配置:
spring.cloud.nacos.config.server-addr=-service-ip>:-service-port>
spring.cloud.nacos.config.namespace=-config-namespace>
spring.cloud.nacos.config.prefix=-config-prefix>
spring.cloud.nacos.config.group=-config-group>
spring.cloud.nacos.config.file-extension=-config-file-extension>
curl -X POST "http://-service-ip>:-service-port>/nacos/v1/cs/configs?dataId=-config-file-id>&group=&content=cat /path/to/your/configfile"
以上命令将在 Nacos 的指定组中添加你的配置文件。现在你可以在你的 Spring Cloud 项目中使用 Nacos 配置了。
在Kubernetes集群中部署Spring Cloud应用程序,可以按照以下步骤进行操作:
创建一个 Yaml 文件,命名为 springcloud.yaml,内容如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: springcloud
spec:
selector:
matchLabels:
app: springcloud
replicas: 1
template:
metadata:
labels:
app: springcloud
spec:
containers:
- name: springcloud
image: >/springcloud:latest
ports:
- containerPort: 8080
env:
- name: SPRING_APPLICATION_JSON
value: '{"spring.cloud.nacos.discovery.server-addr":"${NACOS_ADDR:localhost:8848}","spring.cloud.nacos.config.server-addr":"${NACOS_ADDR:localhost:8848}"}'
restartPolicy: Always
这个配置文件定义了 Spring Cloud 的 Deployment,指定了容器的镜像、端口和重新启动策略。其中通过 SPRING_APPLICATION_JSON 环境变量来指定远程 Nacos 注册中心和配置中心的地址。
kubectl apply -f springcloud.yaml
kubectl get deployments
创建一个 Yaml 文件,命名为 springcloud-resources.yaml,内容如下:
apiVersion: v1
kind: Pod
metadata:
name: springcloud
spec:
containers:
- name: springcloud
image: >/springcloud:latest
ports:
- containerPort: 8080
env:
- name: SPRING_APPLICATION_JSON
value: '{"spring.cloud.nacos.discovery.server-addr":"${NACOS_ADDR:localhost:8848}","spring.cloud.nacos.config.server-addr":"${NACOS_ADDR:localhost:8848}"}'
resources:
limits:
cpu: 500m
memory: 512Mi
requests:
cpu: 100m
memory: 256Mi
这个配置文件指定了 Spring Cloud Pod 的 CPU 和内存请求和限制。
kubectl apply -f springcloud-resources.yaml
kubectl get pods
创建一个 Yaml 文件,命名为 springcloud-service.yaml,内容如下:
apiVersion: v1
kind: Service
metadata:
name: springcloud
spec:
ports:
- port: 8080
targetPort: 8080
selector:
app: springcloud
这个配置文件指定了 Spring Cloud 的 Service 端口,并定义了选择器以将 Service 与 Deployment 关联起来。
kubectl apply -f springcloud-service.yaml
kubectl get services
在 Spring Cloud 应用程序中使用 Nacos 的配置中心服务和注册中心,需要在应用程序的 bootstrap.yml 中添加如下配置:
spring:
cloud:
nacos:
discovery:
server-addr: ${NACOS_ADDR:localhost:8848}
config:
server-addr: ${NACOS_ADDR:localhost:8848}
这个配置指定了远程 Nacos 注册中心和配置中心的地址。
提高Kubernetes部署的安全性和可靠性,可以按照以下步骤进行操作:
使用 SSL/TLS 可保证 MySQL 数据库的通信安全。启用 SSL/TLS 需要生成证书并在 MySQL 中配置 SSL/TLS。具体操作可参考MySQL安全秘籍这篇博客里面有详细的讲解
Kubernetes 的 Secrets 可以安全地存储密码、API keys、证书等敏感信息。使用 Secrets 可以避免把密码等敏感信息写死在代码或配置文件中,降低泄露风险。
创建 Secrets 可以使用 kubectl 命令行工具或 YAML 文件。下面是一个使用 YAML 文件创建 Secrets 的示例:
apiVersion: v1
kind: Secret
metadata:
name: mysql-secrets
type: Opaque
data:
mysql-user: -encoded-user>
mysql-password: -encoded-password>
其中,
和
分别是经过 Base64 编码的用户名和密码。
创建 Secrets 后,可以在容器中使用环境变量或挂载文件的方式来使用 Secrets。例如,在 Nacos 的 Kubernetes 部署中,可通过以下方式使用 Secrets:
env:
- name: MYSQL_USER
valueFrom:
secretKeyRef:
name: mysql-secrets
key: mysql-user
- name: MYSQL_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secrets
key: mysql-password
需要了解更全面的Kubernetes安全策略可点击这个链接
使用 Kubernetes 的 Deployments 可以在 Kubernetes 中运行多个副本,提高容器应用程序的可靠性。使用 Deployments 可以定义副本数量、滚动更新等策略,保证应用程序的高可用性。
以下示例定义了一个名为 nacos 的 Deployment,其中定义了 3 个副本,并启用了滚动更新:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nacos
spec:
selector:
matchLabels:
app: nacos
replicas: 3
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
template:
metadata:
labels:
app: nacos
spec:
containers:
- name: nacos
image: nacos/nacos-server:2.0.3
ports:
- name: http
containerPort: 8848
- name: rpc
containerPort: 8849
注意,在使用多个副本时,需要考虑服务发现、负载均衡等问题。例如,在 Nacos 中,可通过 Nacos 的服务发现功能来实现多副本的服务发现和负载均衡。