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
- 下载Ubuntu sever,这里我下载的是20.04版本
- 步骤
- English -》done -》 done
- proxy address(设置代理,跳过) - 》 done
- mirror address (软件源,设置成阿里云的) - 》
- http:/mirrors.aliyun.com/ubuntu/ - 》 done
- 一直done
- 只能是在普通用户
- 选中安装ssh
- 一直done
- reboot
- 设置root密码
- sudo passwd root
- su
- 设置远程登录root账户
- vim /etc/ssh/sshd_config 增加一行 PermitRootLogin yes
- 重启服务 service ssh restart
- 关闭交换空间(k8s需要关掉,不然占用会很大) swapoff -a
- 关闭防火墙 ufw disable
- 重启登录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
首先找一个目录放置配置文件,进入这个目录进行下面操作
- 导出配置文件
kubeadm config print init-defaults --kubeconfig ClusterConfiguration > kubeadm.yml
- 修改
#修改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
- 拉取镜像 如果上面没设置版本,拉取下来的可能和我们的版本不对应,修改版本号, 然后仓库了东西可以用这样的命令删除:docker rmi -f registry.aliyuncs.com/google_containers/kube-apiserver:v1.18.0
#查看所需镜像列表
kubeadm config images list --config kubeadm.yml
#拉取镜像
kubeadm config images pull --config kubeadm.yml
- 初始化主节点
#定了初始化时需要使用的配置文件,其中添加 --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
- 成功后
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
- 安装上面的步骤配置,直到“配置Master”
- 然后在节点机:
kubeadm join 192.168.17.129:6443 --token abcdef.0123456789abcdef
--discovery-token-ca-cert-hash sha256:6a051b8d0b670f357fe0d8e6a282b062b6f090d1b90968d6c3f3cea8dd33d104
- 然后在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
- 安装Calico 设置好网络后,kubernetes还需要安装calico提供网络链接方案。 官方文档安装: https://docs.projectcalico.org/getting-started/kubernetes/quickstart
#在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容器
- 健康检查
kubectl get cs
#scheduler调度服务,主要作用是将 POD 调度到 Node #controller-manage自动化修复服务,主要作用是 Node 宕机后自动修复 Node 回到正常的工作状态 #etcd-0服务注册与发现
- 查看master状态 kubectl cluster-info
- 查看node状态 kubectl get nodes
- 运行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
- 访问 端口31205
- 删除
kubectl delete pod tomcat kubectl delete service tomcat