欢迎关注微信公众号: 程序员小圈圈
原文首发于: www.zhangruibin.com
本文出自于: RebornChang的博客
转载请标明出处^_^

K8s 入门简介

为什么要有K8s(Kubernetes)

在看这段文字之前,我们要首先知道一个东西,那就是docker。
这里再简单的说下:
docker是容器技术的一种实现方案,同时docker也是docker公司的一个产品。目前主流的容器技术是以docker技术为标准之上的。使用docker可以无需考虑环境问题,docker可以一次构建,到处运行。

如果有很多容器需要管理,单纯使用docker命令来手动管理容器就会显得非常的麻烦,并且容易出错。docker公司提供了docker-compose和内置docker中的docker-swarm来编排服务。使用docker公司提供的编排工具对于中小项目实际上已经足够,但是对于大型分布式应用而言,仅仅对容器编排是不够的。我们需要更强大的功能来管理容器,并且除了docker这个容器实现技术之外的其他容器也是需要编排管理。这是基于docker自身提供的工具就有些力不从心了,而我们又不想自己动手开发。有没有其他容器编排工具呢?肯定有的,容器编排的工具有很多,这里面也有一些公司的开源与兴衰,以及编排容器的工具更迭,好多人都想做那个独角兽,那么选择哪个作为我们使用的工具呢?这里就说这么一个,那就是Kubernetes(K8S)了。

那为什么说这个而不用其他的呢?
这里说以下几点:
1.开源,背后有谷歌基金会支持;
2.社区活跃,中英文都有;
3.成熟。
PS:K8s中文社区 https://www.kubernetes.org.cn/

什么是K8s

k8s是 Kubernetes的简称,是一个编排容器的工具,也是管理应用的全生命周期的一个工具。
不论是从应用的创建,应用的部署,应用提供服务,扩容缩容应用,还是应用更新,都非常的方便,而且可以做到故障自愈,例如一个服务器挂了,可以自动将这个服务器上的服务调度到另外一个主机上进行运行,无需进行人工干涉。

说白了,就是你可以用它设定一些东西,在你的服务一旦挂了的时候,就可以按照固有的设定,将服务转移到其他应用继续为用户提供服务。

K8s的用途

那使用他可以解决什么问题呢?

  • 存储系统挂载
  • Distributing secrets
  • 应用健康检测
  • 应用实例的复制
  • Pod自动伸缩/扩展
  • Naming and discovering
  • 负载均衡
  • 滚动更新
  • 资源监控
  • 日志访问
  • 调度应用程序
  • 提供认证和授权

K8s简单使用

一看到使用,好多同学掉头就走,为啥,因为好多没有自己的VPS,公司的又不敢玩,那怎么办,这里推荐这么一个网址:https://katacoda.com/

在这上面,你可以按照教程一步步入门练习,是不是很爽。
有时候会提示你注册登录,直接编个邮箱密码就行了,也不需要邮箱二次验证~~

那么接下来,我们在这上面选择一个联系linux命令的机器,来用一个新的模拟机器来搭建一个单机版的K8s吧。

单机版K8s的搭建及简单使用

环境准备

  • Centos 7.xx

K8S的安装方式有很多:

  • 官方脚本和社区脚本工具
  • 包管理安装
  • 二进制包安装

包管理安装

1.为了快速搭建K8S和入门介绍,这里采用包管理的方式安装。在安装前最好更新下软件包的源到最新版本。

$ sudo yum -y update

由于K8S包管理中默认包含了docker,如果机器上已经安装过docker,请先卸载docker,不然安装k8s时会提示包冲突而无法安装成功。

2.卸载可能会导致冲突的docker(如果没有安装docker可以跳过)

$ sudo yum -y remove docker-ce docker-ce-cli

因为笔者是在这网站上在线练习的,所以这模拟机器没有安装docker,故跳过本步骤,直接下一步

2.安装K8S和etcd

$ sudo yum -y install kubernetes etcd

在线安装完成之后,如下图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cXnmDkgB-1582709533853)(https://www.zhangruibin.com/upload/2020/02/2jea0ablm0i33phjn6b4u9a4vt.png)]

3.安装完后如果没有报错,开始启动服务

$ sudo systemctl start etcd # 启动etcd服务
$ systemctl status etcd # 查看etcd服务 可以看到etcd已经处于运行状态
$ sudo systemctl start docker # 启动docker服务
$ sudo systemctl status docker # 查看docker服务 可以看到docker已经在运行了
# 启动k8s相关服务
$ sudo systemctl start kube-apiserver
$ sudo systemctl start kube-controller-manager
$ sudo systemctl start kube-scheduler
$ sudo systemctl start kubelet
$ sudo systemctl start kube-proxy

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5BY3of3C-1582709533855)(https://www.zhangruibin.com/upload/2020/02/05aj21aqq0jefrm8m7hengsnun.png)]

此时,我们已经启动了K8s服务,我们使用

kubectl get pods

来看下是否有节点在运行,可以看到没有节点,如下图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Y6D8DCUU-1582709533856)(https://www.zhangruibin.com/upload/2020/02/p6qo4noukojkno6a1g64ps4akv.png)]

以上k8s服务包含了主从节点的服务,如果是分布式安装则不需要安装以上全部,从(node)服务只需要安装kubelet和kube-proxy即可。

安装并检查k8s状态为运行成功后,K8S单节点主从就算是安装成功了。

简单使用

安装成功了,那我们来简单的运行个实例为我们的项目提供服务吧。

1.创建应用
  1. kubectl run kel --image=nginx:1.7.9 --port=80
  2. kubectl get deployments/kel
    可以看到
NAME      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
kel       1         0         0            0           1m

有了image之后就是这么简单。所以,在开发完成程序之后,需要将程序打包成image,然后放到registry中,然后就能够运行应用了。
在部署完成应用之后,就可以看到应用的名称,期望状态是运行一个pod,当前有一个pod,活动的也是一个,还有启动的时间,那么什么是pod呢?
在k8s里面,集群调度的最小单元就是pod,一个pod可以是一个容器,也可以是多个容器,例如你运行一个程序,其中使用了nginx,使用mysql了,使用了jetty,那么可以将这三个使用在同一个pod中,对他们提供统一的调配能力,一个pod只能运行在一个主机上,而一个主机上可以有多个pod。

发布应用

发布应用主要就是对外提供服务,可能会有人提出疑问,我都运行了服务,为什么还不能提供服务,这是因为在集群当中,创建的ip地址等资源,只有在同一个集群中才能访问,每个pod也有独一的ip地址,当有多个pod提供相同的服务的时候,就需要有负载均衡的能力,从而这里就涉及到一个概念就是service,专门用来提供服务的。

kubectl expose deployment  kel --type="NodePort" --port=80

正常的话就会返回:service “kel” exposed

此时我们看我们发布的应用就可以看到已经发布了,命令如下:

kubectl get service/kel

截图如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EyWhJK3O-1582709533857)(https://www.zhangruibin.com/upload/2020/02/6ajlhoit3uhc8of9b6k66g9t9e.png)]
服务主要是用来提供外界访问的接口,服务可以关联一组pod,这些pod的ip地址各不相同,而service相当于一个负载均衡的中间人物,用来指向各个pod,当pod的ip地址发生改变之后,也能做到自动进行负载均衡,在关联的时候,service和pod之间主要通过label来关联,也就是标签(-l表示为label)。

[root@48e2923f0580 ~]# kubectl get service -l run=kel
NAME      CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kel       10.254.120.233   <nodes>       80:32132/TCP   4m

从而外界就可以访问此应用了:
首先用命令可以看到节点的TCP端口

kubectl describe service/kel

然后ping 或者curl就可以通过状态码来看是否成功了。

上面就是怎样发布一个应用,那当用户量变化的时候,怎样扩容呢,以及缩容,还有版本的更迭呢?

看下面

应用的扩容缩容以及版本迭代
扩容
kubectl scale deployments/kel --replicas=2
缩容
kubectl scale deployments/kel --replicas=1
更新
kubectl scale deployments/kel kel=nginx1.8.2

以上就是K8s的简单应用,后续笔者还会有文章来更深 层的对其进行分享。

集群版K8s的搭建

有的人可能会说:单机版的那么简单,搭个集群吧。
其实集群版的也不难,主要是笔者没有那么多机器啊,要两个以上我物理机才能搭建起来,所以集群版的这里就先不说了,什么时候笔者把公司的测试环境搭建一个,再来分享。
其实搭建集群版的并不难,社区上写的挺明白的,centos的参考这个:https://www.kubernetes.org.cn/doc-16
coreos的也有相应的教程的。
也就是几步的事~

K8s使用的注意点

1.nodePort即为映射暴露的端口,默认开放的端口范围是30000-32767,不在默认端口范围内都会报错。
provided port is not in the valid range. The range of valid ports is 30000-32767

2.使用kubectl desccribe pods name时pause失败

注意上面的配置文件拉取镜像时可能会卡住,尤其是使用国内的服务器,如果使用国外的服务器不容易产生这个问题。这个问题由于k8s有从http://k8s.gcr.io/拉取pause镜像,这个网站被国内墙了无法访问所以会造成k8s无法正常启动应用。(pods的READY不为1/1,且STATUS不为Runing状态)可以使用以下命令查看和排查:

$ kubectl get pods #查看服务
$ kubectl describe pods pods名称
``
如果descibe中有报错信息,正如上面的描述。这时我们可以采用手动拉取pause镜像并推送到私有仓库。让kubectl使用我们的私有镜像pause地址而不是k8s.gcr.io地址即能解决。

首先我们要先创建自己的私有仓库:
[docker搭建私有仓库](https://www.linuxidc.com/Linux/2018-03/151308.htm)

搭建完私有仓库后:
- docker pull kubernetes/pause,拉取pause镜像
- docker tag docker.io/kubernetes/pause:latest
172.18.18.90:5000/k8s/pause-amd64.3.0 以私有仓库地址为镜像打标签
- docker push 172.18.18.90:5000/k8s/pause-amd64.3.0,推送到私有仓库
- vi /etc/kubernetes/kubelet配置为`KUBELET_ARGS="--
pod_infra_container_image=172.18.18.90:5000/k8s/pause-amd64.3.0"`,指定kubelet使用的pause镜像地址
-  systemctl restart kubelet,重启kubelet服务。

笔者不创造知识,只是知识的搬运工-_-!

,博主的微信公众号
程序员小圈圈’开始持续更新了哟~~
识别二维码或者直接搜索名字 ‘程序员小圈圈’ 即可关注本公众号哟~~
不只是有技术哟~~
还有很多的学习娱乐资源免费下载哦~~
还可以学下教育知识以及消遣娱乐哟~~
求关注哟~~

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐