Kubernetes(二) 应用部署 - 草堂笺
source link: https://blog.piaoruiqing.com/blog/2019/09/28/kubernetes%E5%BA%94%E7%94%A8%E9%83%A8%E7%BD%B2/?
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
Kubernetes(二) 应用部署
Kubernetes教程之应用部署
文章地址: https://blog.piaoruiqing.com/2019/09/28/kubernetes-2-deploy/
本文将与读者一起, 学习如何在Kubernetes上部署应用. 包括: 如何部署应用、发布文件讲解、将本地项目打包发布等.
阅读这篇文章你能收获到:
- 学会如何在k8s部署应用
- 如何打包Docker镜像、上传到私有库
阅读本文你需要:
- 熟悉Linux命令.
- 有一个Kubernetes环境 (可参考《跟着官方文档从零搭建K8S》在本地部署一套Kubernetes测试环境)
理解描述文件
首先, 我们通过在Kubernetes部署Nginx来理解描述文件.
一般地, Kubernetes使用yaml(或json)来描述发布配置. 下面是一个简单的描述文件: nginx-pod.yaml
apiVersion: v1 # 描述文件所遵循KubernetesAPI的版本
kind: Pod # 描述的类型是pod
metadata:
name: nginx-pod # pod的名称
labels: # 标签
app: nginx-pod
env: test
spec:
containers:
- name: nginx-pod # 容器名
image: nginx:1.15 # 镜像名称及版本
imagePullPolicy: IfNotPresent # 如果本地不存在就去远程仓库拉取
ports:
- containerPort: 80 # pod对外端口
restartPolicy: Always
我们登录Master节点, 使用kubectl
命令来部署这个文件所描述的应用. (当然, 使用dashboard发布也可)
kubectl get pods
命令是用来查看pod列表的, 使用grep
筛选出nginx相关的pod. 此时nginx已经发布完成了. 我们可以从dashboard来直观地查看到应用状态.
备注: 删除pod可使用
kubectl delete -f nginx-pod.yaml
命令, 也可直接在dashboard进行操作.
如何访问服务
上一小节我们部署了一个Nginx pod, 但我们无法访问到该Nginx.
想要访问到pod中的服务, 最简单的方式就是通过端口转发, 执行如下命令, 将宿主机的9999
端口与nginx-pod的80
端口绑定:
[root@nas-centos1 ~]$ kubectl port-forward --address 0.0.0.0 nginx-pod 9999:80
Forwarding from 0.0.0.0:9999 -> 80
Handling connection for 9999
此时, 我们可以通过访问宿主机9999端口来访问Nginx.
部署本地项目
将本地开发的项目发布到Kubernetes, 需要将项目打包成Docker镜像, 然后将镜像推送到仓库(公开/私有仓库都可).
首先, 我们需要一个可以运行的本地项目, 笔者使用spring-boot构建了一个简单的web项目:
@RestController
@RequestMapping(value = "/k8s-test")
@SpringBootApplication
public class K8sTestApplication {
@GetMapping(value = "/timestamp")
public ResponseEntity<?> getTimestamp() {
return ResponseEntity.ok(System.currentTimeMillis() + "\n");
}
public static void main(String[] args) {
SpringApplication.run(K8sTestApplication.class, args);
}
}
打包Docker镜像
有了项目, 我们需要将其打包成一个Docker镜像, Dockerfile
内容如下:
FROM java:8-alpine
COPY ./k8s-test-0.0.1-SNAPSHOT.jar /usr/app/
WORKDIR /usr/app
ENTRYPOINT ["java", "-jar", "k8s-test-0.0.1-SNAPSHOT.jar"]
FROM java:8-alpine
: 该镜像基于java-8-alpine
镜像.COPY ./target/k8s-test-0.0.1-SNAPSHOT.jar /usr/app/
: 将编译打包好的jar拷贝到镜像的/usr/app
目录下.WORKDIR /usr/app
: 工作目录指定为/usr/app
.ENTRYPOINT ["java", "-jar", "k8s-test-0.0.1-SNAPSHOT.jar"]
: 启动docker时执行java -jar k8s-test-0.0.1-SNAPSHOT.jar
命令
进入到Dockerfile所在目录执行docker build -t piaoruiqing/k8s-test .
进行打包. 注意不要遗漏掉命令最后面的.
, 它代表当前目录.
[root@nas-centos1 k8s-test]$ docker build -t piaoruiqing/k8s-test .
通过docker images
命令可以查看本地镜像列表:
[root@nas-centos1 k8s-test]$ docker images | grep k8s
piaoruiqing/k8s-test latest efe9e9625376 4 minutes ago 174MB
推送到远程仓库
docker镜像打包完成后, 需要推送到镜像仓库供Kubernetes各个节点使用. 本文以阿里云的容器镜像服务为例.
首先, 登录到阿里云控制台 -> 容器镜像服务, 创建一个命名空间:
# 登录, 用于登录的用户名为阿里云账号全名, 密码为开通服务时设置的密码.
[root@nas-centos1 k8s-test]$ docker login --username=[用户名] registry.cn-hangzhou.aliyuncs.com
# 打标签, 镜像ID可以通过 docker images 命令查看
[root@nas-centos1 k8s-test]$ docker tag efe9e9625376 registry.cn-hangzhou.aliyuncs.com/piaoruiqing/k8s-test:0.0.1
# 推送到阿里云镜像仓库
[root@nas-centos1 k8s-test]$ docker push registry.cn-hangzhou.aliyuncs.com/piaoruiqing/k8s-test:0.0.1
由于笔者使用了私库, Kubernetes无法直接访问, 发布前需要先创建secret 以支持私有库的访问.
kubectl create secret docker-registry docker-registry-secret --docker-server=registry.cn-hangzhou.aliyuncs.com --docker-username=[用户名] --docker-password=[密码] --docker-email=[邮箱]
docker-registry-secret
: 指定密钥的键名称, 可自行定义.docker-server
: 指定 Docker 仓库地址.docker-username
: 指定 Docker 仓库用户名.docker-password
: 指定 Docker 仓库登录密码.docker-email
: 指定邮件地址(选填).
可通过kubectl get secrets
查看全部secret
[root@nas-centos1 k8s-test]$ kubectl get secrets
NAME TYPE DATA AGE
default-token-s7bps kubernetes.io/service-account-token 3 13d
docker-registry-secret kubernetes.io/dockerconfigjson 1 2m50s
访问私库时, 描述文件中需要指定secret, 如下:
apiVersion: v1
kind: Pod
metadata:
name: k8s-test-pod
labels:
app: k8s-test-pod
spec:
containers:
- name: k8s-test-pod
image: registry.cn-hangzhou.aliyuncs.com/piaoruiqing/k8s-test:0.0.1
imagePullPolicy: IfNotPresent
restartPolicy: Always
imagePullSecrets:
- name: docker-registry-secret # 这里就是前文中创建的secret, 用来访问私库
执行命令kubectl apply -f k8s-test-pod.yaml
进行部署, 完成后我们可以在dashboard查看.
使用kubectl port-forward --address 0.0.0.0 k8s-test-pod 80:8080
可绑定主机(master) 80端口和pod的8080端口. 如此我们就可以访问 http://10.33.30.95/k8s-test/timestamp了.
[root@nas-centos2 ~]$ curl 10.33.30.95/k8s-test/timestamp
1569512136028
现在, 我们已经成功地在Kubernetes上部署了一个应用实例, 生产环境中多数情况下我们的应用需要集群部署, 此时, 我们使用 Deployment 来描述即可:
apiVersion: apps/v1
kind: Deployment
metadata:
name: k8s-test
labels:
app: k8s-test
spec:
replicas: 3 # 副本数量
template:
metadata:
name: k8s-test
labels:
app: k8s-test
env: test
spec:
containers:
- name: k8s-test
image: registry.cn-hangzhou.aliyuncs.com/piaoruiqing/k8s-test:0.0.1
imagePullPolicy: IfNotPresent
ports:
- name: http-port
containerPort: 8080
imagePullSecrets:
- name: docker-registry-secret
restartPolicy: Always
selector:
matchLabels:
app: k8s-test
同样地, 使用kubectl apply -f
命令发布配置即可.
[root@nas-centos1 k8s-test]$ kubectl apply -f k8s-test.yaml
deployment.apps/k8s-test created
欢迎关注公众号(代码如诗)
© 2019, 朴瑞卿.
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK