前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >运维篇 k8s(Kubernetes)

运维篇 k8s(Kubernetes)

作者头像
用针戳左手中指指头
发布2021-01-29 11:09:33
2.9K0
发布2021-01-29 11:09:33
举报
文章被收录于专栏:学习计划

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/05/03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 什么是k8s?
  • 2. 安装Ubuntu server
  • 3. 安装docker
  • 4. 搭建集群
    • 1. 修改主机名
      • 2. 安装kubelet、kubeadm、kubectl
        • 3. 配置master
          • 4. 配置node
            • 5. 网络配置
              • 6. 实例:运行tomcat容器
              相关产品与服务
              容器服务
              腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档