|本文记录在macbook下通过部署minikube来构建一个简单的kubernetes环境,并通过k8s来管理部署一个简单的node应用。
参考:https://minikube.sigs.k8s.io/docs/start/,二进制下载安装:
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-darwin-arm64
sudo install minikube-darwin-arm64 /usr/local/bin/minikube
或homebrew安装:
brew install minikube
brew unlink minikube
brew link minikube
如果安装后执行minikube找不到minikube,可以在~/.zshrc中增加别名:
alias minikube='/opt/homebrew/Cellar/minikube/1.30.1/bin/minikube'
启动minikube
minikube start
| 注意:如果使用Minikube,而不是将Docker镜像push到registry,需要执行,否则在职行后续docker build命令时会遇到repository does not exist or may require ‘docker login’报错
eval $(minikube docker-env)
新建一个node目录,编写app.js
const http = require('http');
//const hostname = '127.0.0.1';
const port = 3000;
const os = require('os');
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end(`Hello World!`);
});
//server.listen(port, hostname, () => {
server.listen(port, () => {
//console.log(`Server running at http://${hostname}:${port}/`);
console.log(`Server running at http fank`);
});
测试效果:
node app.js
在同样目录下编写Dockfile,
FROM node:slim
EXPOSE 3000
COPY app.js .
CMD node app.js
创建本地镜像
docker build -t hello-node:v1 .
查看镜像
docker image ls
删除镜像:
docker rmi <image name>
有多个方式,通常使用deployment可以间接生成pod,但先介绍直接创建pod的办法,即用yaml文件创建pod
编辑 hello-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: hello-node
labels:
app: hellonode
spec:
containers:
- name: hello-node-container
image: hello-node:v1
ports:
- containerPort: 8080
protocol: TCP
执行 kubectl create -f hello-pod.yaml
进行创建
查看pod
kubectl get pods
或
kubectl get po -A
查看pod的描述
kubectl describe pod hello-node
chatgpt给出的deployment简介:
定义deployment的yaml文件:
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-node-deployment
spec:
replicas: 3
selector:
matchLabels:
app: hello-node
template:
metadata:
labels:
app: hello-node
spec:
containers:
- image: hello-node:v2
name: hello-node
ports:
- containerPort: 3000
创建deployment:
kubectl create -f hello-nd-deployment.yaml
查看:
kubectl get deployments
查看详细描述
kubectl describe deployment hello-node-deployment
在 Deployment 生效后,可以使用 Kubernetes 中的 Service 对象来将服务暴露给外部。Service 为 Pod 提供了稳定的网络终结点,并通过负载均衡将流量路由到后端的 Pod 上。
创建service的yaml
apiVersion: v1
kind: Service
metadata:
name: hello-service
spec:
type: LoadBalancer
selector:
app: hello-node
ports:
- protocol: TCP
port: 80
targetPort: 3000
启用服务
kubectl apply -f hello-svc.yaml
查看服务
kubectl get service
浏览器测试
minikube service hello-service
也可以通过端口转换进行连接
kubectl port-forward service/hello-service 2000:80
修改app.js,让代码可以打印服务端pod的IP
const http = require('http');
//const hostname = '127.0.0.1';
const port = 3000;
const os = require('os');
function getIP(){
var interfaces = os.networkInterfaces();
for (var devname in interfaces){
var iface = interfaces[devname];
for (var i = 0; i < iface.length; i++){
var alias = iface[i];
if(alias.family === 'IPv4' && alias.address !=='127.0.0.1' && !alias.internal) {
return alias.address;
}
}
}
}
const ip=getIP()
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end(`Hello World! Address is ${ip}`);
});
//server.listen(port, hostname, () => {
server.listen(port, () => {
//console.log(`Server running at http://${hostname}:${port}/`);
console.log(`Server running at http fank`);
});
更新镜像:
docker build -t hello-node:v2 .
修改deployment的yaml
更新deployment
kubectl apply -f hello-nd-deployment.yaml
遗留问题:
上面service的类型为LoadBalance,共绑定了3个pod,但是在浏览器请求服务时返回的为一个固定的pod ip,负载均衡的效果未体现出来。查询相关信息后可能的原因如下:
1《kubernetes in action》的解释
回话亲和性问题,浏览器使用的keep-alive连接,并通过单个连接发送所有请求,所以响应为同个pod , 解释来源为
2 ChatGpt的解释
Minikube 在本地环境中模拟 Kubernetes 集群,并提供了一些默认的 Service 类型支持。然而,并非所有的 LoadBalancer 类型都能在 Minikube 上正常工作,因为这需要底层基础设施支持。您可以使用 minikube addons list 命令来查看已启用的插件和可用的功能。
由于本地PC环境和云端实际环境有差异,该问题未进一步深究,后续在云上使用真实环境进一步验证
k8s学习笔记合集:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。