目录

1. 创建集群

1.1. 安装 kubectl

kubectl 是 Kubernetes 的命令行工具,可以通过跑命令来控制整个 Kubernetes 集群。

注意:kubectl 的版本要确保与 Kubernetes 最多上下相差一个小版本。安装最新的版本可以无视此项规定。

1.1.1. 安装 kubectl 到 Linux

1.1.1.1. 安装二进制版本

curl -LO https://storage.googleapis.com/kubernetes-release/release/`curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt`/bin/linux/amd64/kubectl
chmod +x ./kubectl
sudo mv ./kubectl /usr/local/bin/kubectl
kubectl version

1.1.1.2. 使用本地包管理器

1.1.1.2.1. Ubuntu, Debian or HypriotOS
sudo apt-get update && sudo apt-get install -y apt-transport-https
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee -a /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubectl
1.1.1.2.2. CentOS, RHEL or Fedora
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF
yum install -y kubectl

1.1.2. 安装 kubectl 到 macOS

1.1.2.1. 安装二进制版本

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/kubectl
kubectl version

1.1.2.2. 使用 Homebrew 安装

brew install kubernetes-cli

1.1.3. 安装 kubectl 到 Windows

1.1.3.1. 安装二进制版本

curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.15.0/bin/windows/amd64/kubectl.exe
// 添加二进制文件到环境变量 PATH 中
kubectl version

1.1.4. 添加命令自动补全支持

1.1.4.1. Zsh

自动补全的脚步可以通过 kubectl completion zsh 查看。下面是配置步骤:

在 ~/.zshrc 文件中添加

source <(kubectl completion zsh)

如果出现 complete:13: command not found: compdef 之类的错误,就在 ~/.zshrc 文件开头添加

autoload -Uz compinit
compinit

1.2. 安装 Minikube

Minikube 可以在本地环境中的虚拟机上快速部署一个单节点的 Kubernetes 集群。

1.2.1. 确保系统支持虚拟化技术

1.2.1.1. Linux

执行以下命令,当输出不为空时即可。

egrep --color 'vmx|svm' /proc/cpuinfo

1.2.1.2. macOS

执行以下命令,当输出不为空时即可。

sysctl -a | grep machdep.cpu.features | grep VMX

1.2.1.3. Windows

执行以下命令

systeminfo

当输出以下内容时,系统支持虚拟化技术。

Hyper-V Requirements:     VM Monitor Mode Extensions: Yes
Virtualization Enabled In Firmware: Yes
Second Level Address Translation: Yes
Data Execution Prevention Available: Yes

当输出以下内容时,系统支持虚拟化技术,并且 Hypervisor 已经安装了,可以忽略下个步骤。

Hyper-V Requirements:     A hypervisor has been detected. Features required for Hyper-V will not be displayed.

1.2.2. 安装 Hypervisor

1.2.2.1. Linux

当系统没有安装 Hypervisor 时,选择下列其中的一个安装即可。

1.2.2.2. macOS

当系统没有安装 Hypervisor 时,选择下列其中的一个安装即可。

1.2.2.3. Windows

当系统没有安装 Hypervisor 时,选择下列其中的一个安装即可。

1.2.3. 安装 Minikube

1.2.3.1. Linux

curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 \
&& chmod +x minikube
sudo install minikube /usr/local/bin

1.2.3.2. Mac

使用 Homebrew

brew cask install minikube

使用二进制文件

curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-darwin-amd64 \
&& chmod +x minikube
sudo mv minikube /usr/local/bin

1.2.3.3. Windows

使用安装器下载并运行 minikube-installer.exe

2. 启动集群

运行 minikube start ,如提示 machine does not exist,则运行 minikube delete 清理本地状态。

3. 启动 Dashboard

运行 minikube dashboard 会自动启动一个网页,在里面可以管理整个集群。

4. 部署一个应用

以下过程可以通过 Module 2 - Deploy an app,在线交互式地完成。

4.1. 查看所有节点及其状态

kubectl get nodes

4.2. 部署 Hello World 应用

kubectl run kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1 --port=8080

通过以下查看部署的应用及状态,等待状态变为 Ready 。

kubectl get deployments

4.3. 创建代理,直连 Pod

可以通过以下命令创建一个代理,直接连接部署的 Pod 进行访问,这是暂时的,后面我们会使用 NodePort、LoadBalancer 等方式暴露服务。

kubectl proxy

通过以下命令查看Kubernetes 版本,测试代理是否成功。

curl http://localhost:8001/version

4.4. 访问部署的应用

export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}')
echo Name of the Pod: $POD_NAME
curl http://localhost:8001/api/v1/namespaces/default/pods/$POD_NAME/proxy/

5. 探索你的应用

以下过程可以通过Module 3 - Explore your app,在线交互式地完成。

5.1. 获取集群 Pod 信息

通过以下命令,可以获取集群中所有 Pod 的信息,包含名称、名称空间、优先级、节点、状态、IP、容器、卷、事件等等。

kubectl describe pods

5.2. 查看容器日志

export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}')
echo Name of the Pod: $POD_NAME
kubectl logs $POD_NAME

5.3. 在容器中执行命令

使用 kubectl 的 exec 指令,可以在容器中执行命令。因为我们之前部署的是单容器的 Pod,因此可以不用指定容器,使用 Pod Name 即可。如果多容器的话可以通过 -c 指定 Container。

kubectl exec $POD_NAME env

还可以直接打开容器内的 bash 进行交互,如下。

kubectl exec -ti $POD_NAME bash
ls
cat server.js
curl localhost:8080
exit

6. 对外暴露你的应用

以下过程可以通过 Module 4 - Expose your app publicly,在线交互式地完成。

6.1. 通过 NodePort 方式创建服务

kubectl get pods
kubectl get services
// type 可选值:ClusterIP、NodePort、LoadBalancer
kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080
kubectl get services
export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}')
curl $(minikube ip):$NODE_PORT

6.2. 打标签

使用 kubectl label 可以给 deployment、pod 以及 service 等等打标签,随后可以通过 kubectl get [deployment | pods | services | svc] -l 过滤带有指定标签的部署、Pod 或者服务等等。

// 给 Pod 打标签
export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}')
echo Name of the Pod: $POD_NAME
kubectl label pod $POD_NAME app=v1
// 描述 Pod
kubectl describe pods $POD_NAME
// 使用标签过滤 Pod
kubectl get pods -l app=v1

6.3. 删除一个服务

// 删除服务
kubectl delete service -l run=kubernetes-bootcamp
// 列出现有服务
kubectl get services
// 外部不可访问
curl $(minikube ip):$NODE_PORT
// 内部可以访问
kubectl exec -ti $POD_NAME curl localhost:8080

7. 扩充你的应用

以下过程可以通过 Module 5 -Scaling Your App,在线交互式地完成。

7.1. 扩充 Deployment

kubectl get deployments
kubectl scale deployments/kubernetes-bootcamp --replicas=4
kubectl get deployments
kubectl get pods -o wide
kubectl describe deployments/kubernetes-bootcamp

7.2. 负载均衡

扩充后,Service 是负载均衡的,测试如下:

kubectl describe services/kubernetes-bootcamp
export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}')
echo NODE_PORT=$NODE_PORT
curl $(minikube ip):$NODE_PORT
curl $(minikube ip):$NODE_PORT
curl $(minikube ip):$NODE_PORT

7.3. 收缩 Deployment

kubectl scale deployments/kubernetes-bootcamp --replicas=2
kubectl get deployments
kubectl get pods -o wide

8. 更新你的应用

以下过程可以通过 Module 6 -Updating Your App,在线交互式地完成。

8.1. 更新应用版本

更新应用时,系统会扩充 Deployment,然后部署新镜像,旧的 Deployment 进入Terminating 状态。流量仅会在可用的 Deployments 之间负载均衡。

kubectl get deployments
kubectl get pods
kubectl describe pods
kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2
kubectl get pods

8.2. 验证更新

// 通过响应内容验证
kubectl describe services/kubernetes-bootcamp
export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}')
echo NODE_PORT=$NODE_PORT
curl $(minikube ip):$NODE_PORT // 通过 rollout status 查看升级进度
kubectl rollout status deployments/kubernetes-bootcamp kubectl describe pods

注意:当且仅当 Deployment 中的 pod template(例如.spec.template) 中的 label 更新或者镜像更改时触发 rollout。

8.3. 回滚更新

kubectl rollout undo deployments/kubernetes-bootcamp

9. 删除你的应用

9.1. 删除服务

kubectl delete service kubernetes-bootcamp

9.2. 删除部署

kubectl delete deployment kubernetes-bootcamp

10. 停用集群

minikube stop

11. 删除集群

minikube delete

【Kubernetes 系列四】Kubernetes 实战:管理 Hello World 集群的更多相关文章

  1. Kubernetes 系列(一):本地k8s集群搭建

    我们需要做以下工作: (1)安装VMware,运行CentOs系统,一个做master,一个做node. (2)安装K8s. (3)安装docker和部分镜像会需要访问外网,所以你需要做些网络方面的准 ...

  2. Kubernetes系列(四) StatefulSet

    作者: LemonNan 原文地址: https://juejin.im/post/6870071267438329869 Kubernetes系列(四) StatefulSet Kubernetes ...

  3. Gravitational Teleport 开源的通过ssh && kubernetes api 管理linux 服务器集群的网关

    Gravitational Teleport 是一个开源的通过ssh && kubernetes api 管理linux 服务器集群的网关 支持以下功能: 基于证书的身份认证 ssh ...

  4. kubernetes实战(九):k8s集群动态存储管理GlusterFS及使用Heketi扩容GlusterFS集群

    1.准备工作 所有节点安装GFS客户端 yum install glusterfs glusterfs-fuse -y 如果不是所有节点要部署GFS管理服务,就在需要部署的节点上打上标签 [root@ ...

  5. kubernetes(K8S)快速安装与配置集群搭建图文教程

    kubernetes(K8S)快速安装与配置集群搭建图文教程 作者: admin 分类: K8S 发布时间: 2018-09-16 12:20 Kubernetes是什么? 首先,它是一个全新的基于容 ...

  6. Redis总结(五)缓存雪崩和缓存穿透等问题 Web API系列(三)统一异常处理 C#总结(一)AutoResetEvent的使用介绍(用AutoResetEvent实现同步) C#总结(二)事件Event 介绍总结 C#总结(三)DataGridView增加全选列 Web API系列(二)接口安全和参数校验 RabbitMQ学习系列(六): RabbitMQ 高可用集群

    Redis总结(五)缓存雪崩和缓存穿透等问题   前面讲过一些redis 缓存的使用和数据持久化.感兴趣的朋友可以看看之前的文章,http://www.cnblogs.com/zhangweizhon ...

  7. Redis 实战篇之搭建集群

    Redis 集群简介# Redis Cluster 即 Redis 集群,是 Redis 官方在 3.0 版本推出的一套分布式存储方案.完全去中心化,由多个节点组成,所有节点彼此互联.Redis 客户 ...

  8. Shiro经过Redis管理会话实现集群(转载)

    原文:http://www.myexception.cn/software-architecture-design/1815507.html Shiro通过Redis管理会话实现集群 写在前面 1.在 ...

  9. 完整的定时任务解决方案Spring集成+定时任务本身管理+DB持久化+集群

    完整的定时任务解决方案Spring集成+定时任务本身管理+DB持久化+集群 maven依赖 <dependency> <groupId>org.quartz-scheduler ...

  10. 项目进阶 之 集群环境搭建(三)多管理节点MySQL集群

    上次的博文项目进阶 之 集群环境搭建(二)MySQL集群中,我们搭建了一个基础的MySQL集群,这篇博客咱们继续讲解MySQL集群的相关内容,同时针对上一篇遗留的问题提出一个解决方案. 1.单管理节点 ...

随机推荐

  1. scrapy 发post请求

    可以使用 yield scrapy.FormRequest(url, formdata, callback)方法发送POST请求. 如果希望程序执行一开始就发送POST请求,可以重写Spider类的s ...

  2. [网络协议]UDP实现的可靠协议

    UDP实现的可靠协议,基本都会对TCP的某一部分进行加强,另外一部分进行削弱.因为: “实时性+可靠性+公平性” 三者不能同时保证,因此可以牺牲TCP的局部公平性来换取更好的实时性,或者更浪费点带宽, ...

  3. 20140117-配置文件为什么放在UI层

    配置文件为什么放在UI层 (刚才写着代码突然忘了配置文件为什么要放在UI层了,只记得晓虎老师强调过.找了半天视频……) 现总结一下: 晓虎老师给出的理由,大体如下:比如一个web项目,分成三层,DAL ...

  4. .NET多线程之调用上下文CallContext

    命名空间:System.Runtime.Remoting.Messaging 类型完全限定名称:System.Runtime.Remoting.Messaging.CallContext 官方介绍:h ...

  5. flash put_movie loadmovie 区别

    put_Movie 应该是c++的函数用来往程序加载一个swf用的,as3里没有loadmovie是flash用的,用来加载另一个swf或jpeg文件 不过这个loadmovie这个函数是在as2中用 ...

  6. Linux下移动图像监测系统——motion的移植及应用

    移动图像监控主系统的开发 移动图像监控的原理方法: 通过获取摄像头图像,比较前后每一帧的图像数据,从而实现移动物体监控.所有移动监控均是如此,只是图像帧的比较算法不同. 移动图像监控系统的实现 选择开 ...

  7. 洛谷 P1101-题解

    这道题可以用深搜(回溯)来写,相信大部分人都是这么想的,但是有些人可能在一些地方饶了半天,所以这里就贴一下我的思路,个人觉得自己的很好懂,除了tx和ty那里,但是tx和ty的那种用法对于输出路径的题目 ...

  8. c语言进阶2-变量的作用域与无参函数

    一.       什么是函数 函数是具有特定功能的模块.可以说一个完整的程序其实是由多个函数共同完成的.C语言的全部工作都是由程式各样的函数完成的,所以也把C语言称为函数式语言.使用模块化设计可能 使 ...

  9. python3.x 与 python2.x 差别记录

    从2.x过渡到3.x的时候,遇到了大大小小的坑,于是便记录下来- 1.print:  3.x 所有print都要加 "( )",print更像(就是)一个函数了. 2.x 可以加& ...

  10. 在工作中常用的Linux命令

    前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 之前写过一篇 < 在公司做的项目和自己在学校做 ...