Kubernetes实战

Stella981
• 阅读 532

使用kind构建一个单层架构Node/Express网络应用程序

Kubernetes实战-从零开始搭建微服务 1

Kubernetes实战

前言

准备写一个Kubernetes实战系列教程,毕竟cnblogs作为国内最早的技术博客现在都已经开始迁移到Kubernetes了,此处要有掌声给博客园。系列会更加偏向于实战,对于理论只在需要时讲解。

Docker hub 上我个人觉着有两个做奇葩的镜像image

  1. dind, docker in docker
  2. kind, kubernetes in docker / k8s in docker

很多人对k8s的学习都是从minikube开始,但是,但是,但是,当你亲身对比kind和minikube的时候,会发现kind至少速度快三倍(在我这台mac老本上)。

1 准备

需要提前安装好

  • docker
  • kubernetes-cli

安装kind

2 创建第一个cluster

需要大概2~3分钟, kind create cluster
Kubernetes实战

会创建一个cluster 名字为kind-kind

kubectl cluster-info 了解下cluster 状况

Kubernetes master is running at https://127.0.0.1:51842
KubeDNS is running at https://127.0.0.1:51842/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

其中的链接即使你的k8s control plane

如果再运行docker ps, 至少会有一个kind-control-plane 的container 在运行。

可以再试试以下命令:

  • kind get clusters 获取所有cluster
  • kubectl config get-contexts
  • kubectl get nodes -o wide
  • kubectl get svc

截止目前,一个单节点的k8s集群就在本地的docker环境里搭建好了。👌

3 发布一个node/express app

创建以下文件,并保存。

Dcoker and App

  • inde.js

    const express = require('express') const app = express() const port = 3000

    app.get('/', (req, res) => res.send('Hello World! running on kubernetes'))

    app.listen(port, () => console.log(Example app listening at http://localhost:${port}))

package.json, package-lock.json 整个项目文件,请访问github repo

  • Dockerfile

    FROM node:14.2.0-alpine EXPOSE 3000 WORKDIR /anode

    ADD package.json . ADD package-lock.json .

    RUN npm ci ADD . .

    CMD ["node", "index.js"]

上传镜像到docker hub (可选)

克隆所有需要的代码和配置文件。 在push镜像之前,不要忘了docker login

docker build -t {yout dockerhub name}/a-node:v1 .
docker push  {yout dockerhub name}/a-node:v1

deployment, service 配置

  • deployment.yaml

    apiVersion: apps/v1 kind: Deployment metadata: name: a-node-deployment labels: app: node spec: replicas: 1 selector: matchLabels: app: a-node template: metadata: labels: app: a-node spec: containers: - name: a-node-container image: tim010/a-node:v1 # or your own image ports: - containerPort: 3000

  • service.yaml

    apiVersion: v1 kind: Service metadata: name: a-node-service spec: ports: - targetPort: 3000 protocol: TCP port: 80 selector: app: a-node-service type: NodePort

发布

kubectl apply -f deployment.yaml

deployment.apps/a-node-deployment created

kubectl apply -f service.yaml

service/a-node-service created

为了确保发布成功,运行

kubectl get pods

应该会输出如图的结果,不要忘了复制你的pod名。
Kubernetes实战

kubectl get service



NAME             TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
a-node-service   NodePort    10.111.52.71   <none>        80:32709/TCP   7h25m
kubernetes          ClusterIP     10.96.0.1       <none>         443/TCP            8h

等等,即使发布成功了,我的app在哪呢?

  • http://10.111.52.71:3000? localhost:3000
  • no

你需要端口转发

kubectl port-forward {your port name for deployment 你的pod名} 3000:3000

Kubernetes实战

取消发布 teardown

kubectl delete -f deployment.yml
kubectl delete -f service.yml

停掉整个cluster

kind delete cluster

结束语

至此,你的本地k8s 集群生命终结。

动手去做永远都会比只学习理论要快得多,希望这第一个教程可以让大家都快速上手,不被K8s复杂的概念吓到。系列后续会写一些更多关于Kubernetes 高可用性 和架构的。

Tips 小提示

源码,参考和推荐

点赞
收藏
评论区
推荐文章
秃头王路飞 秃头王路飞
2个月前
webpack5手撸vue2脚手架
webpack5手撸vue相信工作个12年的小伙伴们在面试的时候多多少少怕被问到关于webpack方面的知识,本菜鸟最近闲来无事,就尝试了手撸了下vue2的脚手架,第一次发帖实在是没有经验,望海涵。 language JavaScript "name": "vuecliversion2", "version": "1.0.0", "desc
技术小男生 技术小男生
2个月前
linux环境jdk环境变量配置
1:编辑系统配置文件vi /etc/profile2:按字母键i进入编辑模式,在最底部添加内容: JAVAHOME/opt/jdk1.8.0152 CLASSPATH.:$JAVAHOME/lib/dt.jar:$JAVAHOME/lib/tools.jar PATH$JAVAHOME/bin:$PATH3:生效配置
光头强的博客 光头强的博客
2个月前
Java面向对象试题
1、 请创建一个Animal动物类,要求有方法eat()方法,方法输出一条语句“吃东西”。 创建一个接口A,接口里有一个抽象方法fly()。创建一个Bird类继承Animal类并实现 接口A里的方法输出一条有语句“鸟儿飞翔”,重写eat()方法输出一条语句“鸟儿 吃虫”。在Test类中向上转型创建b对象,调用eat方法。然后向下转型调用eat()方
刚刚好 刚刚好
2个月前
css问题
1、 在IOS中图片不显示(给图片加了圆角或者img没有父级) <div<img src""/</div div {width: 20px; height: 20px; borderradius: 20px; overflow: h
blmius blmius
1年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录 问题 用navicat导入数据时,报错: 原因这是因为当前的MySQL不支持datetime为0的情况。 解决修改sql\mode: sql\mode:SQL Mode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。 全局s
小森森 小森森
2个月前
校园表白墙微信小程序V1.0 SayLove -基于微信云开发-一键快速搭建,开箱即用
后续会继续更新,敬请期待2.0全新版本 欢迎添加左边的微信一起探讨!项目地址:](https://www.aliyun.com/activity/daily/bestoffer?userCodesskuuw5n) \2. Bug修复更新日历 2. 情侣脸功能大家不要使用了,现在阿里云的接口已经要收费了(土豪请随意), \ \ 和 注意
晴空闲云 晴空闲云
2个月前
css中box-sizing解放盒子实际宽高计算
我们知道传统的盒子模型,如果增加内边距padding和边框border,那么会撑大整个盒子,造成盒子的宽度不好计算,在实务中特别不方便。boxsizing可以设置盒模型的方式,可以很好的设置固定宽高的盒模型。 盒子宽高计算假如我们设置如下盒子:宽度和高度均为200px,那么这会这个盒子实际的宽高就都是200px。但是当我们设置这个盒子的边框和内间距的时候,那
艾木酱 艾木酱
1个月前
快速入门|使用MemFire Cloud构建React Native应用程序
> MemFire Cloud是一款提供云数据库,用户可以创建云数据库,并对数据库进行管理,还可以对数据库进行备份操作。它还提供后端即服务,用户可以在1分钟内新建一个应用,使用自动生成的API和SDK,访问云数据库、对象存储、用户认证与授权等功能,可专
Stella981 Stella981
1年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置 1、virsh edit centos7 找到“memory”和“vcpu”标签,将 <name>centos7</name> <uuid>2220a6d1-a36a-4fbb-8523-e078b3dfe795</uuid>
helloworld_28799839 helloworld_28799839
2个月前
常用知识整理
# Javascript ## 判断对象是否为空 ```js Object.keys(myObject).length === 0 ``` ## 经常使用的三元运算 > 我们经常遇到处理表格列状态字段如 `status` 的时候可以用到 ``` vue