运维篇 k8s(Kubernetes)

2021-01-29 11:09:33 浏览数 (1)

1. 什么是k8s?

k8s是kubernetes的简称,即字母“k”到最后一位相隔8位字母。名字来源于希腊语,意思是“舵手”或“领航员”。

kubernetes是容器集群管理系统,是一个开源的平台,可以实现容器集群的自动化部署、自动扩缩容、维护等功能;它是google在2014年发布的一个开源项目,据说google的数据中心里运行着10多一个容器,而且google十多年前就开始使用容器技术,最初,google开发了一个叫borg的系统(现在命名为Omega)来调度如此庞大数量的容器好工作负载,在积累了这么多年的经验后,google决定重写这个容器管理系统,并将其贡献到开源社区,让全世界受益。

特点:

  • 可移植:支持公有云,私有云,混合云,多重云(多个公共云)
  • 可扩展:模块化,插件化,可挂载,可组合
  • 自动化:自动部署,自动重启,自动复制,自动伸缩/扩展

kubernetes解决了什么?

  • 多个进程协同工作
  • 存储系统挂载
  • 应用健康检查
  • 应用实例的复制
  • 自动伸缩/扩展
  • 注册与发现
  • 负载均衡
  • 滚动更新
  • 资源监控
  • 日志访问
  • 调试应用程序
  • 提供认证和授权

大量的Paas系统都可以运行在Kubernetes上,由于Kubernetes运行在应用界别而不是硬件级,因此提供了普通的Paas平台提供的一些通用功能,比如部署、扩展、负载均衡、日志、监控等。这些默认功能是可选的。

另外,kubernetes不仅仅是一个“编排系统”,它消除了编排的需要。“编排”的定义是指执行一个预定的工作流:先执行A,之后B,然后C 。相反,kubernetes由一组独立的可组合控制进程组成。怎么样从A到C并不重要,达到目的就好,当然几种控制也是必不可少,方法更像排舞的过程。这使得系统更加易用、强大、弹性和可扩展。

2. 安装Ubuntu server

  1. 下载Ubuntu sever,这里我下载的是20.04版本
  2. 步骤
  • English -》done -》 done
  • proxy address(设置代理,跳过) - 》 done
  • mirror address (软件源,设置成阿里云的) - 》
    • http:/mirrors.aliyun.com/ubuntu/ - 》 done
  • 一直done
  • 只能是在普通用户
  • 选中安装ssh
  • 一直done
  • reboot
  1. 设置root密码
  • sudo passwd root
  • su
  1. 设置远程登录root账户
  • vim /etc/ssh/sshd_config 增加一行 PermitRootLogin yes
  1. 重启服务 service ssh restart
  2. 关闭交换空间(k8s需要关掉,不然占用会很大) swapoff -a
  3. 关闭防火墙 ufw disable
  4. 重启登录root账户使操作生效

3. 安装docker

代码语言:javascript复制
#更新软件源
apt-get update

#安装apt依赖,用于通过HTTPS获取仓库
apt-get -y install apt-transport-https ca-certificates curl software-properties-common

#添加docker官方gpg证书
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
#curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

#设置仓库
add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
#这里如果设置出现404看下面

#更新软件源
apt-get -y update

#安装docker-ce
apt-get -y install docker-ce

#设置docker 开启启动和源
#这里就和上一篇dockers安装是一样 的
#开机启动
systemctl enable docker

#这种docker源
vim  /etc/docker/daemon.json 
#加入下面json

 { "registry-mirrors": ["https://5258x07n.mirror.aliyuncs.com"] }

这里设置仓库出现下面报错:404

The repository ‘http://mirrors.aliyun.com/docker-ce/linux/ubuntu focal Release’ does not have a Release file. The repository ‘https://download.docker.com/linux/ubuntu focal Release’ does not have a Release file.

我找到这篇博客:https://www.jb51.net/article/173316.htm vim /etc/apt/sources.list 增加 deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic stable 注释掉原先添加的

4. 搭建集群

Master Master 是 Cluster 的大脑,它的主要职责是调度,即决定将应用放在哪里运行。

Node Node 是 Pod 真正运行的主机,可以是物理机,也可以是虚拟机。为了管理 Pod,每个 Node 节点上至少要运行 container runtime(比如 docker 或者 rkt)、 kubelet 和 kube-proxy 服务。

Pod Kubernetes 使用 Pod 来管理容器,每个 Pod 可以包含一个或多个紧密关联的容器。 Pod 是一组紧密关联的容器集合,它们共享 PID、IPC、Network 和 UTS namespace,是 Kubernetes 调度的基本 单位。Pod 内的多个容器共享网络和文件系统,可以通过进程间通信和文件共享这种简单高效的方式组合完成服务。

Service Service 是应用服务的抽象,通过 labels 为应用提供负载均衡和服务发现。匹配 labels 的 Pod IP 和端口列表组成 endpoints,由 kube-proxy 负责将服务 IP 负载均衡到这些 endpoints 上。

每个 Service 都会自动分配一个 cluster IP(仅在集群内部可访问的虚拟地址)和 DNS 名,其他容器可以通过该地址 或 DNS 来访问服务,而不需要了解后端容器的运行

kubernetes组件

  • etcd 保存了整个集群的状态,服务注册发现;
  • kube-apiserver 提供了资源操作的唯一入口,并提供认证、授权、访问控制等机制;
  • kube-controller-manager 负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;
  • kube-scheduler 负责资源的调度,按照预定的调度策略将 Pod 调度到相应的机器上;
  • kubelet 负责维持容器的生命周期,同时也负责 Volume(CVI)和网络(CNI)的管理;
  • Container runtime 负责镜像管理以及 Pod 和容器的真正运行(CRI),默认的容器运行时为 Docker;
  • kube-proxy 负责为 Service 提供 cluster 内部的服务发现和负载均衡;

1. 修改主机名

查看Ubuntu环境配置文件cloud.cfg(/etc/cloud目录下);管理需要制定主机名

vim /etc/cloud/cloud.cfg preserve_hostname: true

修改主机名为kubernetes-master

hostnamectl set-hostname kubernetes-master #查看是否修改成功 hostnamectl

2. 安装kubelet、kubeadm、kubectl

  • kubelet:主要负责启动pod和容器
  • kubeadm:用于初始化kubernetes集群
  • kubectl:kubernetes的命令行工具,作用是部署和管理应用,查看各种资源,创建,删除和更新组件

#安装系统工具 apt-get update && apt-get install -y apt-transport-http 安装gpg证书 curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add - 写入软件源 cat << EOF >/etc/apt/sources.list.d/kubernetes.list #然后会出现 > ,在后面输入下面两句 deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main EOF #安装kubelet、kubeadm、kubectl apt-get update #这里安装换后注意看一下它安装的版本号,后面用到,就如下图 apt-get install -y kubelet kubeadm kubectl #设置开机启动 systemctl enable kubelet && systemctl start kubelet

版本号图

3. 配置master

首先找一个目录放置配置文件,进入这个目录进行下面操作

  1. 导出配置文件

kubeadm config print init-defaults --kubeconfig ClusterConfiguration > kubeadm.yml

  1. 修改
代码语言:javascript复制
#修改advertiseAddress:为master主机IP 
 advertiseAddress: 192.168.202.128 
 #因为有墙,把镜像源修改为国内的,比如阿里云 
imageRepository: registry.aliyuncs.com/google_containers 
#顺便配置calico的默认网段(后面网络配置会用到) 
podSubnet: "192.168.0.0/16"
#修改kubernetes的版本
kubernetesVersion: v1.18.2
  1. 拉取镜像 如果上面没设置版本,拉取下来的可能和我们的版本不对应,修改版本号, 然后仓库了东西可以用这样的命令删除:docker rmi -f registry.aliyuncs.com/google_containers/kube-apiserver:v1.18.0
代码语言:javascript复制
#查看所需镜像列表 
kubeadm config images list --config kubeadm.yml
#拉取镜像 
kubeadm config images pull --config kubeadm.yml
  1. 初始化主节点
代码语言:javascript复制
#定了初始化时需要使用的配置文件,其中添加 --experimental-upload-certs 参数可以在后续执行加入节点时自动 分发证书文件。追加的 tee kubeadm-init.log 用以输出日志 (这个日志也算重要的)
kubeadm init --config=kubeadm.yml --experimental-upload-certs | tee kubeadm-init.log

但是出现报错:unknown flag: --experimental-upload-certs 百度知道这是版本升级造成的,将将–experimental-upload-certs 替换为 --upload-certs 所以应该使用下面的命令

代码语言:javascript复制
kubeadm init --config=kubeadm.yml --upload-certs | tee kubeadm-init.log

执行这个命令会检查我们的机子是否复合要求 这里我执行后就提示我CPU需要2核,转好虚拟机后就没设置这些东西

之后设置后,看到successful小激动一下,记下下图中最下面的那行用来加入节点的,如果你清空面板,找不到了,就找刚刚保存的那个日志文件: kubeadm-init.log

  1. 成功后
代码语言:javascript复制
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

kubeadm init 的执行过程 init:指定版本进行初始化操作 preflight:初始化前的检查和下载所需要的 Docker 镜像文件 kubelet-start:生成 kubelet 的配置文件 var/lib/kubelet/config.yaml ,没有这个文件 kubelet 无法启 动,所以初始化之前的 kubelet 实际上启动不会成功 certificates:生成 Kubernetes 使用的证书,存放在 /etc/kubernetes/pki 目录中 kubeconfig:生成 KubeConfig 文件,存放在 /etc/kubernetes 目录中,组件之间通信需要使用对应文件 control-plane:使用 /etc/kubernetes/manifest 目录下的 YAML 文件,安装 Master 组件 etcd:使用 /etc/kubernetes/manifest/etcd.yaml 安装 Etcd 服务 wait-control-plane:等待 control-plan 部署的 Master 组件启动 apiclient:检查 Master 组件服务状态。 uploadconfig:更新配置 kubelet:使用 configMap 配置 kubelet patchnode:更新 CNI 信息到 Node 上,通过注释的方式记录 mark-control-plane:为当前节点打标签,打了角色 Master,和不可调度标签,这样默认就不会使用 Master 节点来运行 Pod bootstrap-token:生成 token 记录下来,后边使用 kubeadm join 往集群中添加节点时会用到 addons:安装附加组件 CoreDNS 和 kube-proxy

4. 配置node

  1. 安装上面的步骤配置,直到“配置Master”
  2. 然后在节点机:
代码语言:javascript复制
kubeadm join 192.168.17.129:6443 --token abcdef.0123456789abcdef 
    --discovery-token-ca-cert-hash sha256:6a051b8d0b670f357fe0d8e6a282b062b6f090d1b90968d6c3f3cea8dd33d104 
  1. 然后在master主机验证是否节点是否加入 kubectl get nodes

5. 网络配置

加入节点后,但我们的容器还没真正相同,需要配置网络, 查看kubernetes组件状态

代码语言:javascript复制
kubectl get pod -n kube-system -o wide

查看网关 route -n 如果没有route 命令,那就安装一下:apt install net-tools

#修改配置文件 vim /etc/netplan/00-installer-config.yaml

代码语言:javascript复制
network:
  ethernets:
    ens33:
      #dhcp4: true
      addresses: [192.168.17.129/24]
      gateway4: 192.168.17.2
      nameservers:
              addresses: [192.168.17.2]
  version: 2

#刷新配置 netplan apply

修改DNS

代码语言:javascript复制
#ubuntu18的dns配置文件是交给systemd-resolved这个服务管理的,有可能会被他覆盖我们自定的dns地址,所以先停止 systemd-resolved的服务 
systemctl stop systemd-resolved

#修改dns 
vim /etc/systemd/resolved.conf 
nameserver 8.8.8.8

systemctl start systemd-resolved

#测试
ping www.baidu.com
  1. 安装Calico 设置好网络后,kubernetes还需要安装calico提供网络链接方案。 官方文档安装: https://docs.projectcalico.org/getting-started/kubernetes/quickstart
代码语言:javascript复制
#在Master操作即可 
kubectl apply -f https://docs.projectcalico.org/v3.7/manifests/calico.yaml 
#验证是否成功 
kubectl get pods --all-namespaces

如果在安装时有一个pod没有启动起来,就把节点删除,重新加入

出现过:ImagePullBackOff,ErrImagePull 删除节点,重新加入,重入,可以将节点机重启一下。

删除节点 kubectl delete node kubernetes-node1

在删除的节点机上 kubeadm reset

然后再执行kubectl join …

6. 实例:运行tomcat容器

  1. 健康检查

kubectl get cs

#scheduler调度服务,主要作用是将 POD 调度到 Node #controller-manage自动化修复服务,主要作用是 Node 宕机后自动修复 Node 回到正常的工作状态 #etcd-0服务注册与发现

  1. 查看master状态 kubectl cluster-info
  2. 查看node状态 kubectl get nodes
  3. 运行tomcat容器 #使用kubectl命令创建两个监听8080端口的tomcat pod(Kubernetes运行容器的最小单元) kubectl run tomcat --image=tomcat --replicas=2 --port=80

#查看pod状态 kubectl get pods

#查看已部署的服务 (不知是不是版本问题,别人的版本这个命令可以看到tomcat的) #看下面截图中,发现创建的是pod/tomcat ,别人创建的是service/tomcat,不懂 kubectl get deployment

#映射服务 kubectl expose deployment tomcat --port=8080 --type=LoadBalancer #没有deployment,这里改成 kubectl expose pod tomcat --port=8080 --type=LoadBalancer

#查看已经发布的服务

kubectl get services

#查看服务详情 kubectl describe service tomcat

  1. 访问 端口31205
  1. 删除

kubectl delete pod tomcat kubectl delete service tomcat

0 人点赞