Kubernetes-Linux部署K8S集群!

1,543 阅读7分钟

这是我参与 8 月更文挑战的第 21 天,活动详情查看: 8月更文挑战

Kubernetes简介

Kubernetes是Google基于Borg开源的容器编排调度引擎,作为CNCF(Cloud Native Computing Foundation)最重要的组件之一,它的目标不仅仅是一个编排系统,而是提供一个规范,可以让你来描述集群的架构,定义服务的最终状态,Kubernetes可以帮你将系统自动得达到和维持在这个状态。

更直白的说,Kubernetes可以让用户通过编写一个yaml或者json格式的配置文件,也可以是通过工具/代码生成或者是直接请求Kubernetes API来创建应用,该配置文件中包含了用户想要应用程序保持的状态,不管整个Kubernetes集群中的个别主机发生什么问题,都不会影响应用程序的状态,你还可以通过改变该配置文件或请求Kubernetes API来改变应用程序的状态。

这意味着开发人员不需要在意节点的数目,也不需要在意从哪里运行容器以及如何与它们交流。开发人员也不需要管理硬件优化,或担心节点关闭(它们将遵循墨菲法则),因为新的节点会添加到Kubernetes集群,同时Kubernetes会在其他运行的节点中添加容器,Kubernetes会发挥最大的作用。

总结:Kubernetes是容器控制平台,可以抽象所有的底层基础设施(容器运行用到的基础设施)。

Kubernetes——让容器应用进入大规模工业生产。

Pod

Kubernetes有很多技术概念,同时对应很多API对象,最重要的也是最基础的对象就是Pod。Pod是Kubernetes集群中运行部署应用的最小单元,并且是支持多个容器的。

Pod的设计理念是支持多个容器在一个Pod中共享网络地址和文件系统,可以通过进程间通信和文件共享这种简单高效的方式组合完成服务。Pod对多容器的支持是Kubernetes最基础的设计理念。比如你运行一个操作系统发行版的软件仓库,一个Nginx容器用来发布软件,另一个容器专门用来从源仓库做同步,这两个容器的镜像不太可能是一个团队开发的,但是他们一块儿工作才能提供一个微服务;这种情况下,不同的团队各自开发构建自己的容器镜像,在部署的时候组合成一个微服务对外提供服务。不过,在大多数情况下,我们只会在Pod中运行一个容器,本文中的例子也是这样的。

Pod 的另一个特征是:如果我们希望使用其他 RKE 等技术的话,我们可以做到不依赖Docker容器。

Docker是kubernetes中最常用的容器运行时,但是Pod也支持其他容器运行时。

总的来说,Pod的主要特征包括:

  • 每个Pod可以在Kubernetes集群内拥有唯一的IP地址;
  • Pod可以拥有多个容器。这些容器共享同一个端口空间,所以他们可以通过localhost交流(可想而知它们无法使用相同的端口),与其他Pod内容器的交流可以通过结合Pod的IP来完成;
  • 一个Pod内的容器共享同一个卷、同一个 IP、端口空间、IPC 命名空间。

Service

Kubernetes中的Service资源可以作为一组提供相同服务的Pod的入口,这个资源肩负发现服务和平衡Pod之间负荷的重任。

在Kubernetes集群中,我们拥有提供不同服务的Pod,那么Service如何知道该处理哪个Pod呢?

这个问题就用标签来解决的,具体分两个步骤:

  • 给所有需要Service处理的对象Pod贴上标签。
  • 在Service中使用一个选择器(Label Selector),该选择器定义了所有贴有对应的标签的对象Pod。

Deployment

其实在k8s中,我们很少直接使用Pod,更多的是使用Kubernetes的另外一种资源:Deployment

Deployment表示用户对Kubernetes集群的一次更新操作。可以是创建一个新的服务或是更新一个新的服务,也可以是滚动升级一个服务。Deployment可以帮助每一个应用程序的生命都保持相同的一点:那就是变化。此外,只有挂掉的应用程序才会一尘不变,否则,新的需求会源源不断地涌现,更多代码会被开发出来、打包以及部署,这个过程中的每一步都有可能出错。Deployment可以自动化应用程序从一版本升迁到另一版本的过程,并保证服务不间断,如果有意外发生,它可以让我们迅速回滚到前一个版本。

apiVersion: apps/v1
kind: Deployment # 定义Kubernetes资源的类型为Deployment
metadata:
  name: demo-web-deployment # 定义资源的名称
  labels:
    app: demo-web-deployment
spec:  # 定义资源的状态。
  replicas: 2 # 定义我们想运行多少个Pod,在这里我们希望运行2个
  selector:
    matchLabels: # 定义该部署匹配哪些Pod
      app: demo-web
  minReadySeconds: 5 # 可选,指定Pod可以变成可用状态的最小秒数,默认是0
  strategy: # 指定更新版本时,部署使用的策略
    type: RollingUpdate # 策略类型,使用RollingUpdate可以保证部署期间服务不间断
    rollingUpdate:
      maxUnavailable: 1 # 部署时最大允许停止的Pod数量(与replicas相比)
      maxSurge: 1 # 部署时最大允许创建的Pod数量(与replicas相比)
  template: # 用来指定Pod的模板,与Pod的定义类似
    metadata:
      labels: # 根据模板创建的Pod会被贴上该标签,与上面的matchLabels对应
        app: demo-web
    spec:
      containers:
        - name: web
          image: rainingnight/aspnetcore-web
          imagePullPolicy: Always # 默认是IfNotPresent,如果设置成Always,则每一次部署都会重新拉取容器映像(否则,如果本地存在指定的镜像版本,就不会再去拉取)
          ports:
            - containerPort: 80

Kubernetes安装

关闭防火墙

[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld

禁用selinux

[root@localhost ~]# setenforce 0

禁用swap分区

vim /etc/fstab

image-20210819235436798

安装docker-ce

# 安装docker所需的工具
yum install -y yum-utils device-mapper-persistent-data lvm2
# 配置阿里云的docker源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 指定安装这个版本的docker-ce
yum install -y docker-ce-18.09.9-3.el7
# 启动docker
systemctl enable docker && systemctl start docker

#设置docker镜像加速
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://v16stybc.mirror.aliyuncs.com"]
}
EOF

image-20210820000033050

安装K8S

#设置yum源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
#开始安装
yum install -y kubelet-1.15.0 kubeadm-1.15.0 kubectl-1.15.0

image-20210820000606057

image-20210820000910184

设置k8s自启

systemctl enable kubelet && systemctl start kubelet

设置自动补全

echo "source <(kubectl completion bash)" >> ~/.bash_profile
source .bash_profile 

初始化节点

kubeadm init --kubernetes-version=1.15.0 --image-repository registry.aliyuncs.com/google_containers

如果出现错误,一定要记得清除配置再重新初始化

kubeadm reset -f

初始化完成之后,你会发现多了很多的docker镜像

image-20210820002039181

运行提示的命令

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

image-20210820002501372

查看集群信息

kubectl cluster-info

image-20210820002940289

初始化完成要运行提示的命令,要不然会出现以下报错

image-20210820002549965

安装dashboard

参考官方文档, 执行下面的命令可以快速安装dashboard v2.0.0:

kubectl apply -f "https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/aio/deploy/recommended.yaml"

以上文件在国内因为众所周知的原因可能无法正常下载。简单的解决方案就是在 github 上打开 recommended.yaml, 然后复制代码保存到本地, 然后再执行:

kubectl apply -f kubernetes-dashboard.yaml

使用vim进行粘贴时,可能出现许多#还有乱码情况

解决方法就是在vim中输入:set paste即可

kubectl proxy

image-20210820010631509

访问http://IP地址:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/

kubernets实现负载均衡实例

编写nginx.yaml文件

apiVersion: v1
kind: Service
metadata:
  name: my-nginx-svc
  labels:
    app: nginx
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: nginx
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

使用文件进行部署

kubectl apply -f nginx.yaml

image-20210820103907300

指定了pod的数量之后,如果删除掉一个pod,不能满足pod数量要求的话,就会创建新的pod

image-20210820104501535

修改每个pod的网页内容,方便当下观察

image-20210820104804183

查看服务暴露的IP地址

image-20210820105450303

访问这个服务暴露的端口,默认多个pod之间是可以实现负载均衡的效果

image-20210820105706669

参考资料

[Kubernetes初探1]:部署您的第一个ASP.NET Core应用到k8s集群

推荐阅读

Linux Shell编程基础!

Linux sudo和sudoers详解!

Linux部署samba服务器!

Linux Zabbix 5.0安装详解!

docker之docker-compose的使用!

docker之Dockerfile文件详解!