云原生技术容器编排学习(第四集)

Posted 技术能量站

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了云原生技术容器编排学习(第四集)相关的知识,希望对你有一定的参考价值。

1、简述

操作k8s集群可以分为两种方式:

  1. 使用kubectl命令行工具;
  2. 通过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 //设置当前使用的上下文

相关资料

  1. Install and Set Up kubectl
  2. Configure Access to Multiple Clusters

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 后端服务。

以上是关于云原生技术容器编排学习(第四集)的主要内容,如果未能解决你的问题,请参考以下文章

云原生技术容器编排学习(第五集)

云原生容器技术 4 云原生容器技术概要介绍-容器编排技术基础-Kubernetes

云原生容器编排技术Docker Compose

权力的游戏第七季第四集百度云资源迅雷下载在线观看

云原生学习之一:微服务

华为云大咖带你玩转云原生基础设施之K8s