云原生技术容器编排学习(第四集)
Posted 技术能量站
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了云原生技术容器编排学习(第四集)相关的知识,希望对你有一定的参考价值。
1、简述
操作k8s集群可以分为两种方式:
- 使用kubectl命令行工具;
- 通过Dashboard页面可视化操作。Dashboard在k8s上是以插件的方式安装,集群出现问题时可能无法正常显示,还需要使用kubectl命令行工具来排查问题,并且命令行的方式效率很高,因此kubectl的安装与配置是管理员必须要掌握的。
2、环境准备
2.1 安装 kubectl
kubectl本身只是一个可执行文件,不需要处理依赖关系,因此安装很简单,根据安装平台,下载相应的可执行文件然后配置环境变量既可。国内用户最可能遇到的问题就是无法下载(保存在谷歌的服务器上,需要科学上网)。
- kubectl下载:根据自己的操作系统选择相对应的可执行文件,以Windows为例,下载kubectl.exe文件。上传了百度云,有需要可以自行下载。
链接:https://pan.baidu.com/s/12PlWum80u90UPPyQdVBKEg 密码:lbas - 环境变量配置:打开环境变量编辑窗口,添加名为KUBECTL的变量,其值为kubectl.exe文件所在路径,在Path中再添加“%KUBECTL%”。同样的,也可以直接在Path中添加kubectl路径。
配置
安装完kubectl之后,还对它进行基本的配置,新建一个config文件(磁盘中任意位置,需要配置名为KUBECONFIG的环境变量,路径指向config文件,同kubectl配置操作)没有后缀,重命名为config。
apiVersion: v1
kind: Config
preferences:
#集群
clusters:
- cluster:
certificate-authority-data: #CA证书
server: #api server地址
name: k8sprod
#用户
users:
- name: admin
user:
as-user-extra:
client-certificate-data: #admin证书
client-key-data: #私钥
#上下文
contexts:
- context:
cluster: k8sprod
user: admin
name: admin
#设置默认上下文
current-context: admin
可以看到,配置文件中主要包含三部分:
- clusters:指定CA证书和api server地址
- users:集群用户,可以使用证书或者用户名、密码的方式登录
- contexts:上下文,绑定用户与集群,可以设置默认使用的context
文件配置完成后,可以使用 kubectl cluster-info 查看是否可以正常操作集群。配置文件中可以指定多个集群、多个用户、多个上下文,方便对k8s集群的统一管理,迅速切换。
kubectl config use-context admin //设置当前使用的上下文
相关资料
2.3 安装 minikube
安装环境
vmware的ubuntu18.04.1的虚拟机
# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 18.04.1 LTS
Release: 18.04
Codename: bionic
容器:
# docker version
Client:
Version: 18.09.7
API version: 1.39
Go version: go1.10.1
Git commit: 2d0083d
Built: Fri Aug 16 14:20:06 2019
OS/Arch: linux/amd64
Experimental: false
Server:
Engine:
Version: 18.09.7
API version: 1.39 (minimum version 1.12)
Go version: go1.10.1
Git commit: 2d0083d
Built: Wed Aug 14 19:41:23 2019
OS/Arch: linux/amd64
Experimental: false
前置条件
- 支持虚拟化
egrep -q ‘vmx|svm’ /proc/cpuinfo && echo yes || echo no
这里得输出是yes,表示你的机器支持虚拟化 - 安装virtualbox(不是必须的了)
Minikube 也支持 --vm-driver=none 选项来在本机运行 Kubernetes 组件,这时候需要本机安装了 Docker。此外 none 驱动会运行一个不安全的API Server,会导致安全隐患,不建议在个人工作环境安装。下载地址:https://www.virtualbox.org/wiki/Linux_Downloads
启动
##以前
minikube start
## 现在,某些选项要明确指定了, 比如–image-mirror-country 为cn的时候,就用的阿里,
##阿里代表cn了,以前用这个阿里的minikube是直接start的,现在:
minikube start --image-mirror-country cn
–iso-url=https://kubernetes.oss-cn-hangzhou.aliyuncs.com/minikube/iso/minikube-v1.5.1.iso
–registry-mirror=https://xxxx.mirror.aliyuncs.com
–kubernetes-version=v1.16.2
–image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers
–vm-driver=none
参数说明
- –vm-driver=none:这代表用宿主机的docker来搞,用kvm或者virtualbox太耗资源了,以前你用虚拟机的时候用minikube ssh登陆进vm,再docker ps看到一堆容器,现在这堆容器直接起在你的宿主机里了.
- –registry-mirror:这里用你自己的阿里云镜像加速器地址
- mainland:minikube start -h 里有2个地方出现了mainland,分别是:
- -image-mirror-country
- -image-repository
基本架构
Minikube利用本地虚拟机环境部署Kubernetes,其基本架构如下图所示:
来源:https://developer.aliyun.com/article/221687
2.3 安装 kind
kind 是另一个在开发机上快速安装 kubernetes 的管理工具。使用 kind 需要安装了 docker。这里是它的安装指南kind/quick-start.
MacOS 上使用 brew 安装 kind 的相对简单
brew install kind
Window上如果使用 choco 包管理工具安装 kind 也比较简单:
choco install kind
Linux 上安装 kind 可以直接从二进制发布包安装
curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.12.0/kind-linux-amd64
chmod +x ./kind
mv ./kind /some-dir-in-your-PATH/kind
最新的版本号,可以从这里查看:https://github.com/kubernetes-sigs/kind/releases
3. kuberctl 基本操作
3.1 使用 kubeconfig 文件组织集群访问
通过 kubectl 连接k8s集群时,默认情况下,kubectl 会在 $HOME/.kube 目录下查找名为 config 的文件,我直接root用户登录的、我的 config配置文件路径为 ~/.kube/config
下面贴上具体的配置和简要注释:
apiVersion: v1
kind: Config
clusters:
- name: "fralychen" # 集群名称、下面的contexts里面的cluster:value值对应
cluster:
server: "https://rancher.fralychen.com/k8s/clusters/a-99abr"
users:
- name: "fralychen" # 用户名称、下面的contexts里面的user:value值对应
user:
token: "****"
contexts:
- name: "fralychen" # 上下文名称、在命令行中做集群切换时会用到
context:
user: "fralychen"
cluster: "fralychen"
current-context: "fralychen" # 当前正在使用的上下文名称、表示kubectl连接的集群为fralychen
3.2 配置对多集群的访问
在将集群、用户和上下文定义在一个或多个配置文件中之后,用户可以使用 kubectl config use-context 命令快速地在集群之间进行切换。rancher针对每个集群都有对应的kubeconfig文件,文件中连接的用户(user)名、集群(cluster)名、上下文(contexts)都是对应的,我这边根据字段一一添加到~/.kube/config文件中即可
apiVersion: v1
kind: Config
clusters:
- name: "fralychen"
cluster:
server: "https://rancher.fralychen.com/k8s/clusters/a-99abr"
- name: "fralychen1" # 这是新加的
cluster:
server: "https://rancher.fralychen.com/k8s/clusters/c-t8nci"
users:
- name: "fralychen"
user:
token: "****"
- name: "fralychen1" # 这是新加的
user:
token: "***"
contexts:
- name: "fralychen"
context:
user: "fralychen"
cluster: "fralychen"
- name: "fralychen1" # 这是新加的
context:
user: "fralychen1"
cluster: "fralychen1"
current-context: "fralychen"
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: wTU1aS1NLV2MrRS9JVXpsSEY3UGlYYzBUMXZNazRLbm11cwp5VlNmZz0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
server: https://10.111.111.111:6443
name: abj
- cluster:
certificate-authority-data: MKWHU5emloM0U0VUs0Ri9MTGRpTzA0MFIvVTV1YlJmQUVLWFUlRJRklDQVRFLS0tLS0K
server: https://10.111.111.111:6443
name: asg
- cluster:
certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUQ2ekNDQXRPZ0F3i0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
server: https://10.111.111.111:6443
name: cloud9-rs-bj
contexts:
- context:
cluster: abj
user: abj
name: abj
- context:
cluster: asg
user: asg
name: asg
- context:
cluster: cloud9-rs-bj
user: cloud9-rs-bj
name: cloud9-rs-bj
current-context: fr
kind: Config
preferences:
users:
- name: abj
user:
client-certificate-data: dE92eXZrOWgKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
client-key-data: RFIEtFWS0tLS0tCg==
- name: asg
user:
client-certificate-data: hNU0VlNmVnWFVmWi9XWjVoY091ejIKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
client-key-data: E9PQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo=
- name: cloud9-rs-bj
user:
client-certificate-data: EZRTlk4MlREbXNiU2E0S0ZQaGprZXM2TE9mTEtzLzM5NHRDS1BoagotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
client-key-data: bnc9PQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo=
3.3 集群切换
kubectl config view #查看config配置信息
3.4 kubectl config 常见命令
current-context 显示 current_context
delete-cluster 删除 kubeconfig 文件中指定的集群
delete-context 删除 kubeconfig 文件中指定的 context
get-clusters 显示 kubeconfig 文件中定义的集群
get-contexts 描述一个或多个 contexts
rename-context Renames a context from the kubeconfig file.
set 设置 kubeconfig 文件中的一个单个值
set-cluster 设置 kubeconfig 文件中的一个集群条目
set-context 设置 kubeconfig 文件中的一个 context 条目
set-credentials 设置 kubeconfig 文件中的一个用户条目
unset 取消设置 kubeconfig 文件中的一个单个值
use-context 设置 kubeconfig 文件中的当前上下文
view 显示合并的 kubeconfig 配置或一个指定的 kubeconfig 文件
4. k8s 服务部署
4.1 部署和查看
回顾我们在 “使用Dockerfile制作镜像” 一节里制作过的 python docker 镜像程序。镜像推送到镜像仓库的tag名字是fanfeilong/cloud_native_hello_py,源码结构如下:
├── .dockerignore
├── .gitignore
├── Dockerfile
├── README.md
└── src
├── main.py
└── requirements.txt
我们在根目录下创建一个 k8s 的部署配置文件,文件是 yaml 格式,文件名为k8s_python_sample_code.deployment.yml,内容如下,注意name字段不能是下划线命名风格:
apiVersion: apps/v1
kind: Deployment
metadata:
name: cloud-native-hello-py
labels:
app: cloud-native-hello-py
spec:
replicas: 3
selector:
matchLabels:
app: cloud-native-hello-py
template:
metadata:
labels:
app: cloud-native-hello-py
spec:
containers:
- name: cloud-native-hello-py
image: fanfeilong/cloud_native_hello_py
ports:
- containerPort: 1024
通过一组操作来部署和查看状态:
- 使用命令
kubectl create -f k8s.deployment.yaml
部署到 k8s 集群,“部署” 本身被当一种资源创建过程 - 使用命令
kubectl get deployments
查看部署情况 - 使用命令
kubectl rollout status deployment/cloud-native-hello-py
查看状态。
4.2 查看 ReplicaSet 和 Pods
k8s 通过 deployment 部署,deployment 管理副本集合ReplicaSet ,而 ReplicaSet 包含多个Pod。那么Pod又是什么呢?
Pod是一个或多个容器的组合,这些容器共享存储、网络和命名空间,以及如何运行的规范。Pod是 K8s 的最小可部署单元。
我们先通过命令kubectl get rs直观地看下 ReplicaSet
我们再通过命令kubectl get pods直观地看下 pods
可以看到有一个 ReplicaSet,管理三个 Pods。ReplicaSet 管理多个 Pod,确保以指定个数的副本运行部署的服务。
ReplicaSet 的信息解释:
- NAME:ReplicaSet 名字
- DESIRED:需要的 pod 副本个数
- CURRENT:当前运行的 pod 副本个数
- READY: 有多少个副本对用户可用
- AGE:运行开始到现在的时间
Pod的列信息大同小异:
- NAME: 名字
- READY: 就绪状态
- STATUS: 运行状态
- RESTARTS:重启次数
- AGE:运行开始到现在的时间
4.3 使用 kubectl 启动服务(service)
经过 deployment,cloud_native_hello_py 项目的目录结构如下:
.
├── Dockerfile
├── README.md
├── k8s.deployment.yaml
└── src
├── main.py
└── requirements.txt
在根目录下增加一个文件k8s.service.yaml,内容如下:
apiVersion: v1
kind: Service
metadata:
name: cloud-native-hello-py
spec:
selector:
app: cloud-native-hello-py
ports:
- protocol: TCP
port: 1024
targetPort: 1024
注意: targetPort 必须和 deployment 步骤里容器的导出端口一致
使用如下的命令来创建服务
kubectl create -f k8s.service.yaml
对服务做下端口转发
使用浏览器直接访问
HelloWorld! 恭喜你成功地在 K8S 上部署启动了一个 Python Flask 后端服务。
以上是关于云原生技术容器编排学习(第四集)的主要内容,如果未能解决你的问题,请参考以下文章