前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【k8s学习笔记三】kubernetes本地环境部署测试

【k8s学习笔记三】kubernetes本地环境部署测试

原创
作者头像
fankhu
修改2023-07-12 00:25:26
6480
修改2023-07-12 00:25:26
举报

|本文记录在macbook下通过部署minikube来构建一个简单的kubernetes环境,并通过k8s来管理部署一个简单的node应用。

0 准备工作

  • docker on mac
  • node

一 安装minikube

参考:https://minikube.sigs.k8s.io/docs/start/,二进制下载安装:

代码语言:txt
复制
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-darwin-arm64
sudo install minikube-darwin-arm64 /usr/local/bin/minikube

或homebrew安装:

代码语言:javascript
复制
brew install minikube
brew unlink minikube
brew link minikube

如果安装后执行minikube找不到minikube,可以在~/.zshrc中增加别名:

代码语言:txt
复制
alias minikube='/opt/homebrew/Cellar/minikube/1.30.1/bin/minikube'

启动minikube

代码语言:txt
复制
minikube start

| 注意:如果使用Minikube,而不是将Docker镜像push到registry,需要执行,否则在职行后续docker build命令时会遇到repository does not exist or may require ‘docker login’报错

代码语言:javascript
复制
eval $(minikube docker-env)

二 node测试

新建一个node目录,编写app.js

代码语言:javascript
复制
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`);
});

测试效果:

代码语言:javascript
复制
node app.js

三 创建docer镜像

在同样目录下编写Dockfile,

代码语言:javascript
复制
FROM node:slim
EXPOSE 3000
COPY app.js .
CMD node app.js

创建本地镜像

代码语言:javascript
复制
docker build -t hello-node:v1 .

查看镜像

代码语言:javascript
复制
docker image ls

删除镜像:

代码语言:javascript
复制
docker rmi <image name>

四 创建pod

有多个方式,通常使用deployment可以间接生成pod,但先介绍直接创建pod的办法,即用yaml文件创建pod

编辑 hello-pod.yaml

代码语言:javascript
复制
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

代码语言:javascript
复制
kubectl get pods
或
kubectl get po -A

查看pod的描述

代码语言:javascript
复制
kubectl describe pod hello-node

五 deployment介绍

chatgpt给出的deployment简介:

定义deployment的yaml文件:

代码语言:javascript
复制
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:

代码语言:javascript
复制
kubectl create -f hello-nd-deployment.yaml

查看:

代码语言:javascript
复制
kubectl get deployments

查看详细描述

代码语言:javascript
复制
kubectl describe deployment hello-node-deployment

六 使用service对外暴露服务

在 Deployment 生效后,可以使用 Kubernetes 中的 Service 对象来将服务暴露给外部。Service 为 Pod 提供了稳定的网络终结点,并通过负载均衡将流量路由到后端的 Pod 上。

创建service的yaml

代码语言:javascript
复制
apiVersion: v1
kind: Service
metadata:
  name: hello-service
spec:
  type: LoadBalancer
  selector:
    app: hello-node
  ports:
    - protocol: TCP
      port: 80
      targetPort: 3000

启用服务

代码语言:javascript
复制
kubectl apply -f hello-svc.yaml
查看服务
kubectl get service

浏览器测试

代码语言:javascript
复制
minikube service hello-service

也可以通过端口转换进行连接

代码语言:javascript
复制
kubectl port-forward service/hello-service 2000:80

七 更新代码并发布

修改app.js,让代码可以打印服务端pod的IP

代码语言:javascript
复制
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`);
});

更新镜像:

代码语言:javascript
复制
docker build -t hello-node:v2 .

修改deployment的yaml

更新deployment

代码语言:javascript
复制
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学习笔记合集:

【k8s学习笔记一】容器及Docker基础

【k8s学习笔记二】腾讯云harbor私有仓库部署实践

【k8s学习笔记三】kubernetes本地环境部署测试

k8s学习笔记四】kubernetes ingress测试

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 0 准备工作
  • 一 安装minikube
  • 二 node测试
  • 三 创建docer镜像
  • 四 创建pod
  • 五 deployment介绍
  • 六 使用service对外暴露服务
  • 七 更新代码并发布
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com