Kubernetes-running app on kube

news2025/2/1 4:19:33

Docker

安装Docker

首先,您需要在Linux机器上安装Docker。如果您不使用Linux,则需要启动一个Linux虚拟机(VM)并在该虚拟机中运行Docker。如果你使用的是Mac或Windows系统,并按照指令安装Docker, Docker将为你建立一个虚拟机,并在该虚拟机中运行Docker守护进程。Docker客户端可执行文件将在您的主机操作系统上可用,并将与虚拟机中的守护进程通信。

要安装Docker,请按照您的特定操作系统http://docs.docker.com/engine/ installation/的说明进行安装。安装完成后,您可以使用Docker客户端可执行文件运行各种Docker命令。例如,您可以尝试从Docker Hub中提取并运行一个现有的image
Docker注册表,其中包含许多知名软件包的现成容器image。其中之一是busybox image,您将使用它来运行一个简单的echo“Hello world”命令。

如果您不熟悉busybox,它是一个可执行文件,它结合了许多标准的UNIX命令行工具,如echo、ls、gzip等。除了busybox images,您还可以使用任何其他成熟的操作系统容器images,例如
Fedora、Ubuntu或其他类似的镜像,只要它包含echo可执行文件。

如何运行busybox映像?您不需要下载或安装任何东西。使用docker run命令并指定要下载和运行的映像以及(可选地)要执行的命令,如下面的Listing 2:

在你的例子中,应用程序是一个单一的可执行程序(busybox),但它也可能是一个具有许多依赖项的极其复杂的应用程序。set up和运行应用程序的整个过程将完全相同。同样重要的是,应用程序是在容器中执行的,与机器上运行的所有其他进程完全隔离。

docker run发生了什么?

首先,Docker检查busybox:latest映像是否已经存在于您的本地机器上。它不是,所以Docker从Docker Hub注册表http://docker.io中提取了它。在映像下载到您的机器之后,Docker从该映像创建了一个容器,并在其中运行命令。echo命令将文本打印到STDOUT,然后进程终止,容器停止。

看Figure 2.1

运行其他images

运行其他现有容器映像的方式与运行busybox映像的方式大致相同。实际上,它通常更简单,因为您通常不需要像在示例中那样指定要执行什么命令(echo "Hello world")。应该执行的命令通常包含在映像本身中,但是如果需要,也可以覆盖它。

$ docker run <image>

给image打tag

所有的软件包都会更新,所以一个软件包通常不止一个版本。Docker支持以相同的名称拥有相同映像的多个版本或变体。每个变体必须有一个唯一的标记。

$ docker run <image>:<tag>

创建Dockerfile

要将应用程序打包成镜像,首先需要创建一个名为Dockerfile的文件,其中包含Docker在构建镜像时执行的指令列表。Dockerfile需要与app.js(相当于你的main文件或者启动类)文件在同一个目录下,并且应该包含如下清单所示的命令。

FROM行定义了将用作起点的容器映像(要在其上构建的基本映像)。

在本例中,使用的是节点容器映像标记7。

在第二行中,将本地目录中的app.js文件以相同的名称(app.js)添加到图像中的根目录中。

最后,在第三行中,定义在运行映像时应该执行什么命令。在您的示例中,命令是node app.js。

选择基本图像(base image node:7)
你可能想知道为什么我们选择这个特定的图像作为你的基础。因为你的应用程序是一个node .js应用程序,你需要你的镜像包含节点二进制可执行文件来运行应用程序。你可以使用任何包含该二进制文件的镜像,或者你甚至可以使用Linux发行版基础镜像,如fedora或ubuntu并安装
在构建映像时将Node.js装入容器。但由于节点映像是专门为运行node .js应用而制作的,并且包含了运行应用所需的所有内容,因此您将使用它作为基础映像。

或者你也可以选择Ubuntu Golang等其他base-image

创建Container

现在你有了Dockerfile和app.js文件,你就有了构建镜像所需的一切。要构建它,运行以下Docker命令:

$ docker build -t kubia .

Figure2.2显示了构建过程中发生的情况。您告诉Docker基于当前目录的内容构建一个名为kubia的映像(注意build命令末尾的点)。Docker将在目录中查找Dockerfile,并根据文件中的说明构建镜像。

如何构建image

构建过程不是由Docker客户端执行的。相反,整个目录的内容被上传到Docker守护进程,并在那里构建镜像。
客户机和守护进程根本不需要在同一台机器上。如果你正在使用Docker在非linux操作系统上,客户端在您的主机操作系统上,但守护进程在虚拟机中运行。因为构建目录中的所有文件都被上传到守护进程,如果它包含许多大文件,并且守护进程不在本地运行,则上传可能需要更长的时间。

TIP:不要在构建目录中包含任何不必要的文件,因为它们会减慢构建过程——尤其是当Docker守护进程在远程机器上时。

在构建过程中,Docker将首先从公共映像存储库(Docker Hub)中提取基本映像(node:7),除非该映像已经被提取并存储在您的机器上。

image不是单个的、大的二进制 blob,而是由多个层组成的,您可能已经在运行 busybox 示例时注意到了这一点(有多个 Pull complete 行,每个层一个)。

例如,如果你基于同一个基础image(例如本例中的node:7)创建多个images,那么所有组成基础image的层只会被存储一次,而且,当拉取一个image时,Docker会单独下载每个层,有些层可能已经存储在你的机器上,所以Docker只会下载那些没有存储的层。

你可能认为每个 Dockerfile 只创建一个新层,但事实并非如此。

在构建image时,将为每个单独的命令创建一个新层。
在Dockerfile中。在构建image期间,在拉出基础的所有层之后
Docker会在它们上面创建一个新层,并将app.js文件添加进去。
然后,它将创建另一个层,该层将指定在运行image时应该执行的命令。最后一层将被标记为kubia:latest。这是Figure2.3所示,它还显示了另一个名为other:latest的image将如何使用与您自己的image相同的Node.js image层。

构建过程完成后,本地存储了一个新image。您可以通过让Docker列出所有本地存储的image来查看它,如下面的Listing所示。

Running the container image

# 以kubia作为image 创建 一个kubia-container
# 本地机器上的8080端口将映射到容器内的8080端口(-p 8080:8080选项)
# 通过http://localhost:8080访问该应用程序。


$ docker run --name kubia-container -p 8080:8080 -d kubia

列出所有正在运行的容器

在当前容器中运行shell

# -i   它确保STDIN保持打开状态。在shell中输入命令时需要它。
# -t   分配一个伪终端(TTY)。
$ docker exec -it kubia-container bash

进入容器查看进程

停止或者移除容器

$ docker stop kubia-container
$ docker rm kubia-container

创建Kubernetes集群

使用Minikub运行本地单节点Kubernetes集群

安装MINIKUBE

Minikube是一个单独的二进制文件,需要下载并放到您的路径上。它适用于OSX、Linux和Windows。要安装它,最好从GitHub上的Minikube存储库(http://github.com/kubernetes/minikube)开始,并按照那里的说明进行安装。
例如,在OSX和Linux上,Minikube可以通过一个命令下载和设置。对于OSX,如下:

$ curl -Lo minikube https://storage.googleapis.com/minikube/releases/
➥ v0.23.0/minikube-darwin-amd64 && chmod +x minikube && sudo mv minikube
➥ /usr/local/bin/

在Linux上,您可以下载不同的版本(URL中将“darwin”替换为“Linux”)。在Windows上,您可以手动下载该文件,将其重命名为minikube.exe,并将其放在您的路径中。Minikube在虚拟机中通过VirtualBox或KVM运行Kubernetes,因此您还需要安装其中一个,然后才能启动Minikube集群。

在本地安装了Minikube之后,可以使用以下清单中的命令立即启动Kubernetes集群。

安装kubernetes客户端(kubectl)

要与Kubernetes交互,还需要kubectl CLI客户端。同样,您所需要做的就是下载它并将其放在您的路径上。例如,OSX的最新稳定版本可以使用以下命令下载和安装:

$ curl -LO https://storage.googleapis.com/kubernetes-release/release
➥ /$(curl -s https://storage.googleapis.com/kubernetes-release/release
➥ /stable.txt)/bin/darwin/amd64/kubectl 
➥ && chmod +x kubectl 
➥ && sudo mv kubectl /usr/local/bin/

要下载Linux版本的kubectl,请将URL中的darwin替换为Linux。对于Windows,将其替换为Windows并在末尾添加.exe。

检查cluster是否up

$ kubectl cluster-info
Kubernetes master is running at https://192.168.99.100:8443
KubeDNS is running at https://192.168.99.100:8443/api/v1/proxy/...
kubernetes-dashboard is running at https://192.168.99.100:8443/api/v1/...

创建3-nodes的clsuter

$ gcloud container clusters create kubia --num-nodes 3 
➥ --machine-type f1-micro
Creating cluster kubia...done.
Created [https://container.googleapis.com/v1/projects/kubia1-
1227/zones/europe-west1-d/clusters/kubia].
kubeconfig entry generated for kubia.
NAME ZONE MST_VER MASTER_IP TYPE NODE_VER NUM_NODES STATUS
kubia eu-w1d 1.5.3 104.155.92.30 f1-micro 1.5.3 3 RUNNING

下图是一个集群交互的草图:

$ kubectl get nodes
NAME STATUS AGE VERSION
gke-kubia-85f6-node-0rrx Ready 1m v1.5.3
gke-kubia-85f6-node-heo1 Ready 1m v1.5.3
gke-kubia-85f6-node-vs9f Ready 1m v1.5.3

查看当前node状态

$ kubectl describe node gke-kubia-85f6-node-0rrx

将image部署在kubernetes上

尝试运行您之前创建并推送到Docker Hub的image。下面是如何在Kubernetes中运行它

$ kubectl run kubia --image=luksa/kubia --port=8080 --generator=run/v1
replicationcontroller "kubia" created

什么是pod?

pod是一组由一个或多个紧密相关的容器,它们总是在相同的工作节点和相同的Linux名称空间中一起运行。每个pod就像一台独立的机器,有自己的IP、主机名、进程等等,运行单个应用程序。

应用程序可以是在单个容器中运行的单个进程,也可以是一个主应用程序进程和其他支持进程,每个进程在自己的容器中运行。

为了更好地理解容器、pod和节点之间的关系,请查看Figure2.5。如您所见,每个pod都有自己的IP,并包含一个或多个容器,每个容器运行一个应用程序进程。pod分布在不同的工作节点上。

# 查看所有pods
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
kubia-4jfyf 0/1 Pending 0 1m
kubelet-09fyf 1/1 Running 0 10m

下图是Kubernetes中运行容器image必须执行的步骤:

  1. 首先将构建好的image推送到Docker Hub,这个推送是为了你的worker nodes 去使用,本地的话你可以直接放在本地仓库
  2. 当您运行kubectl命令时,它通过向Kubernetes API服务器发送REST HTTP请求,在集群中创建了一个新的ReplicationController对象。

  3. ReplicationController创建一个新的pod,然后由Scheduler将其调度到其中一个工作节点

  4. 该节点上的Kubelet看到pod被调度到它,并指示Docker从注册表中提取指定的映像,因为该映像在本地不可用。

每个pod都有自己的IP地址,但是这个地址位于集群内部,不能从集群外部访问。为了让pod能从外面进入,你要通过一个服务对象。您将创建一个LoadBalancer类型的特殊服务,因为如果您创建一个常规服务(一个ClusterIP服务),比如pod,那么它也只能从集群内部访问。通过创建loadbalancer类型的服务,将创建一个外部负载平衡器,您可以通过负载平衡器的公共IP连接到pod。

$ kubectl expose rc kubia --type=LoadBalancer --name kubia-http
service "kubia-http" exposed

查看服务

$ kubectl get services
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes 10.3.240.1 <none> 443/TCP 34m
kubia-http 10.3.246.185 <pending> 8080:31348/TCP 4s


$ kubectl get svc
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes 10.3.240.1 <none> 443/TCP 35m
kubia-http 10.3.246.185 104.155.74.57 8080:31348/TCP 1m

要从集群外部访问该pod,您告诉Kubernetes将由该ReplicationController管理的所有pod公开为一个服务。这三个要素的大致情况见Figure2.7

水平扩展应用程序

使用Kubernetes的主要好处之一是可以简单地扩展部署,将运行实例的数量增加到3个。

$ kubectl get replicationcontrollers
NAME DESIRED CURRENT AGE
kubia 1 1 17m

$ kubectl scale rc kubia --replicas=3
replicationcontroller "kubia" scaled

$ kubectl get rc
NAME DESIRED CURRENT READY AGE
kubia 3 3 2 17m


$ kubectl get pods
NAME READY STATUS RESTARTS AGE
kubia-hczji 1/1 Running 0 7s
kubia-iq9y6 0/1 Pending 0 7s
kubia-4jfyf 1/1 Running 0 18m

图2.8显示了系统的新状态,你仍然有单一的服务和单一的RC,但是现在有三个pod实例,都由ReplicationController管理。该服务不再将所有请求发送到单个pod,而是将它们分散到所有三个pod中。

$ kubectl describe pod kubia-hczji
Name: kubia-hczji
Namespace: default
Node: gke-kubia-85f6-node-vs9f/10.132.0.3 
Start Time: Fri, 29 Apr 2016 14:12:33 +0200
Labels: run=kubia
Status: Running
IP: 10.1.0.2
Controllers: ReplicationController/kubia
Containers: ...
Conditions:
 Type Status
 Ready True 
Volumes: ...
Events: ...




$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
kubia-hczji 1/1 Running 0 7s 10.1.0.2 gke-kubia-85...
$ kubectl cluster-info | grep dashboard
kubernetes-dashboard is running at https://104.155.108.191/api/v1/proxy/
➥ namespaces/kube-system/services/kubernetes-dashboard

未完待续。。。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1555634.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

京东云服务器价格_云主机价格查询系统_2024年京东云优惠活动

2024年京东云服务器优惠价格表&#xff0c;轻量云主机优惠价格5.8元1个月、轻量云主机2C2G3M价格50元一年、196元三年&#xff0c;2C4G5M轻量云主机165元一年&#xff0c;4核8G5M云主机880元一年&#xff0c;游戏联机服务器4C16G配置26元1个月、4C32G价格65元1个月、8核32G费用…

基于Unity+Vue3通信交互的WebGL项目发布实践

基于UnityVue3通信交互的WebGL项目发布实践 实践路线 基于UnityVue3通信交互的WebGL项目发布实践问题背景准备工作解决方案项目实践小目标搭建Unity测试项目 创建Vue3测试项目运行项目验证unity和vue通信功能总结与展望 问题背景 我们最近需要把unity开发的pc项目迁移到web端&…

MacOS M1/M2/M3芯片如何安装Python3.6

前言 Mac电脑M芯片安装Python3.6报错。 一般情况下&#xff0c;Mac系统可以使用homebrew来管理安装软件。 brew search搜索发现&#xff0c;最低只能直接安装python3.7版本。 于是从Python官网下载安装包进行安装&#xff0c;确实也没有报错&#xff0c;安装完成后执行总是k…

爬虫学习(爬取音乐)

import re import requestsurl "http://www.yy8844.cn/ting/numes/sussoc.shtml" response requests.get(url) response.encoding "gbk" # print(r.text) #第一步&#xff0c;访问网页获取MusicID p re.compile(r"MusicId(.*?);",re.S) prin…

大数据-hive,初步了解

1. Hive是什么 Hive是基于Hadoop的数据仓库解决方案。由于Hadoop本身在数据存储和计算方面有很好的可扩展性和高容错性&#xff0c;因此使用Hive构建的数据仓库也秉承了这些特性。 简单来说&#xff0c;Hive就是在Hadoop上架了一层SQL接口&#xff0c;可以将SQL翻译成MapRedu…

【Node.JS】koa

文章目录 概述koa和express对比koa下载安装使用1.创建koa项目文件目录2. 创建koa服务3. 添加路由 koa-router4. 数据库服务 mongodb5. 添加请求参数json处理 koa-bodyparser6. 用户接口举例7.引入koa一些常用插件8.用户登录验证 koa-jwt9.webpack生产打包 来源 概述 Koa 是一个…

数据结构(六)——图

六、图 6.1 图的基本概念 图的定义 图&#xff1a;图G由顶点集V和边集E组成&#xff0c;记为G (V, E)&#xff0c;其中V(G)表示图G中顶点的有限非空集&#xff1b;E(G) 表示图G中顶点之间的关系&#xff08;边&#xff09;集合。若V {v1, v2, … , vn}&#xff0c;则用|V|…

Jenkins实现CICD

Jenkins实现CICD JenkinsCI简介环境安装新建任务源码管理构建配置发送邮件配置自动化项目定时构建 JenkinsCD简介配置ssh保证其可以免登录接下来配置github的webhook正式实现自动化打包master主分支的代码将前端三剑客代码文件发送到网站服务器对应的tomcat Jenkins面试题 Jenk…

微信小程序的页面制作---常用组件及其属性2

一、标签栏taBar 在全局配置文件app.json中添加taBar配置&#xff0c;可实现标签栏配置。标签栏最少2个&#xff0c;最多5个 &#xff08;1&#xff09;如何配置标签栏&#xff1f; 1》先建多个文件&#xff0c;&#xff08;以我的index&#xff0c;list&#xff0c;myform文…

民航电子数据库:CAEMigrator迁移数据库时总是卡死

目录 一、场景二、异常情况三、排查四、应急方案 一、场景 1、对接民航电子数据库 2、将mysql数据库迁移到cae数据库 3、使用CAEMigrator迁移工具进行数据库迁移时&#xff0c;该工具会卡死&#xff08;不清楚是否是部署cae服务的服务器资源导致&#xff09; 二、异常情况 …

【服务端】node.js详细的配置

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

《剑指 Offer》专项突破版 - 面试题 95、96 和 97 : 和动态规划相关的双序列问题(C++ 实现)

目录 前言 面试题 95 : 最长公共子序列 面试题 96 : 字符串交织 面试题 97 : 子序列的数目 前言 和单序列问题不同&#xff0c;双序列问题的输入有两个或更多的序列&#xff0c;通常是两个字符串或数组。由于输入是两个序列&#xff0c;因此状态转移方程通常有两个参数&am…

持续交付/持续部署流程主要系统构成(CD)

目录 一、概述 二、持续交付/持续部署主要构成 2.1 镜像容器管理系统 2.1.1 镜像分类 2.1.1.1 磁盘镜像 2.1.1.2 镜像容器 2.1.1.2.1 镜像容器分层管理示意图 2.1.2 镜像容器管理系统软件 2.2 配置管理系统 2.2.1 配置管理系统的功能 2.2.1.1 管理操作系统层、中间件…

goland annotate置灰点不动问题解决

goland 项目突然看不到左侧边栏提交记录&#xff0c;annotate按钮灰色不可点击&#xff0c;右键菜单也没有git&#xff0c;尝试各种方法终于解决。 原因是项目使用的非安全模式启动。 C:\Users\用户名\AppData\Roaming\JetBrains\GoLand2022.3\options 路径下的 trusted-path…

java分割回文串(力扣Leetcode131)

分割回文串 力扣原题链接 问题描述 给定一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是回文串。返回 s 所有可能的分割方案。 示例 示例 1: 输入&#xff1a;s “aab” 输出&#xff1a;[[“a”,“a”,“b”],[“aa”,“b”]] 示例 2: 输…

第十四届蓝桥杯省赛C++ B组所有题目以及题解(C++)【编程题均通过100%测试数据】

第一题《日期统计》【枚举】 【问题描述】 小蓝现在有一个长度为100的数组&#xff0c;数组中的每个元素的值都在0到9的范围之内。数组中的元素从左至右如下所示&#xff1a; 5 6 8 6 9 1 6 1 2 4 9 1 9 8 2 3 6 4 7 7 5 9 5 0 3 8 7 5 8 1 5 8 6 1 8 3 0 3 7 9 2 7 0 5 8 8 …

原生数据开发软件 TablePlus for mac

一款非常好用的本地原生数据开发软件&#xff1a;TablePlus激活版。 软件下载&#xff1a;TablePlus for mac v3.11.0激活版 这款优秀的数据库编辑工具支持 MySQL、SQL Server、PostgreSQL 等多种数据库&#xff0c;具备备份、恢复、云同步等功能。它可以帮助您轻松编辑数据库中…

KUKA机器人安全信号的接入方式

KUKA机器人的安全信号与IO模块是相互独立的&#xff0c;即安全信号不是通过IO信号接入到机器人里。安全信号主要是指:急停、安全门等属于机器人安全控制类的信号。 一、KUKA机器人安全信号的接入方式有以下3种&#xff1a; 1、第一种方式:Profisafe,以软件包的形式安装机器人…

2024最新网络编程 面试题解析

2024最新网络编程 面试题解析 三次握手和四次挥手 三次握手 三次握手是TCP/IP协议中用于建立可靠连接的过程。具体步骤如下&#xff1a; 第一次握手&#xff1a;客户端发送一个带有SYN标志的TCP报文段给服务器&#xff0c;请求建立连接&#xff0c;并进入SYN_SENT状态。 第…

Radash一款JavaScript最新的实用工具库,Lodash的平替!

文章目录 Lodash 的痛点进入正题--Radash特点 举例几个常用的api 一说lodash应该大部分前端同学都知道吧&#xff0c;陪伴我们好多年的JavaScript工具库&#xff0c;但是自从 ES6 出现后就慢慢退出前端人的视线&#xff0c;能ES6写的代码绝对不会用Lodash&#xff0c;也不是完全…