kubernetes
概述
linux命令查询网址:https://man.linuxde.net
中文社区:https://www.kubernetes.org.cn/doc-14
官网地址:https://kubernetes.io/zh/docs/concepts/overview
—kubernetes名字来自希腊语,意思是舵手(领航员),k8s是将k和s之间的8个字母ubernete替换成8的缩写
—Kubernetes的创造者是行业巨头Google
—Kubernetes是基于Borg的大规模容器管理的开源版本
—2014年6月Google正式公布并宣布开源
—编配,管理,调度等各方面集成的一套管理容器的系统
—Kubernetes 是一个开源容器管理工具,负责容器部署,容器扩缩容以及负载平衡等功能
—Kubernetes 不是一个容器化平台,而是一个多容器管理解决方案
kubernetes适用场景
—有大量跨主机的容器需要管理
—快速部署应用
—快速扩张应用
—无缝对接的应用功能
—节省资源,优化硬件资源的使用
kubernetes架构
核心角色: master(管理节点), node(计算节点),image(镜像仓库)
master节点
—Master提供集群的控制
—对集群进行决策
—检测和影响集群事件
—Master主要由 apiserver schedule controllermanager etcd组成
1 API Server 提供 REST 操作和到集群共享状态的前端,所有其他组件通过它进行交互,端口6443。
2 Schedule 监视那些新创建的未指定运行节点的 Pod,并选择节点让 Pod 在上面运行,端口10251。
3 controller-manager 主节点上运行控制器的组件,负责管理控制器,端口10252.
节点控制器(Node Controller): 负责在节点出现故障时进行通知和响应。
副本控制器(Replication Controller): 负责为系统中的每个副本控制器对象维护正确数量的 Pod。
端点控制器(Endpoints Controller): 填充端点(Endpoints)对象(即加入 Service 与 Pod)。
服务帐户和令牌控制器(Service Account & Token Controllers): 为新的命名空间创建默认帐户和 API 访问令牌.
4 etcd 是兼具一致性和高可用性的键值数据库,可以作为保存 Kubernetes 所有集群数据的后台数据库,用户无需手动干预,集群自动管理,端口2379-2380。
node节点
—kubernetes的计算节点
—维护运行pod,并提供具体应用的环境
—计算节点设计成水平扩展,该组件在多个节点上运行
—node由kubelet,kube-proxy,和docker组成
1 pod:最小部署单元,一组容器的集合,共享网络,生命周期是短暂的
2 kubelet 一个在集群中每个节点上运行的代理。它保证容器都运行在 Pod 中
3 kuber-proxy 是集群中每个节点上运行的网络代理,实现 Kubernetes Service 概念的一部分,维护节点上的网络规则。这些网络规则允许从集群内部或外部的网络会话与 Pod 进行网络通信。
4 Container Runtime 容器运行环境是负责运行容器的软件 支持多个容器运行环境: docker、 containerd、CRI-O 以及任何实现 Kubernetes CRI (容器运行环境接口)。
插件(Addons) 。
5 docker:是一个开源的应用容器引擎,基于Go语言实现,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
Addons插件
插件使用 Kubernetes 资源(DaemonSet、 Deployment等)实现集群功能。 因为这些插件提供集群级别的功能,插件中命名空间域的资源属于 kube-system 命名空间。
1 DNS:集群 DNS 是一个 DNS 服务器,和环境中的其他 DNS 服务器一起工作,它为 Kubernetes 服务提供 DNS 记录。
2 Web 界面:Dashboard 是K ubernetes 集群的通用的、基于 Web 的用户界面。 它使用户可以管理集群中运行的应用程序以及集群本身并进行故障排除。
3 容器资源监控 :容器资源监控 将关于容器的一些常见的时间序列度量值保存到一个集中的数据库中,并提供用于浏览这些数据的界面。
4 集群层面日志 :机制负责将容器的日志数据 保存到一个集中的日志存储中,该存储能够提供搜索和浏览接口。
5 网络插件:flannel是一个可以用于 Kubernetes 的 overlay 网络提供者,实质上是一种“覆盖网络”也就是将TCP数据包装在另一种网络里面进行路由转发和通信,目前支持UDP,VxLAN,AWS VPC和GCE路由数据转发方式。不同主机的内容实现互通互联。https://github.com/coreos/flannel/blob/master/Documentation/kube-flannel.yml
总结k8s概念
- cluster
cluster是 计算、存储和网络资源的集合,k8s利用这些资源运行各种基于容器的应用。
2.master
master是cluster的大脑,他的主要职责是调度,即决定将应用放在那里运行。master运行linux操作系统,可以是物理机或者虚拟机。为了实现高可用,可以运行多个master。
3.node
node的职责是运行容器应用。node由master管理,node负责监控并汇报容器的状态,同时根据master的要求管理容器的生命周期。node运行在linux的操作系统上,可以是物理机或者是虚拟机。
4.pod
pod是k8s的最小工作单元。每个pod包含一个或者多个容器。pod中的容器会作为一个整体被master调度到一个node上运行。
5.kube-controller-manager
k8s通常不会直接创建pod,而是通过controller来管理pod的。controller中定义了pod的部署特性,比如有几个剧本,在什么样的node上运行等。为了满足不同的业务场景,k8s提供了多种controller,包括deployment、replicaset、daemonset、statefulset、job等。
6.deployment
是最常用的controller(控制器)。deployment可以管理pod的多个副本,并确保pod按照期望的状态运行,滚动升级和回滚应用,扩容和缩容。
7.replicaset
实现了pod的多副本管理。使用deployment时会自动创建replicaset,也就是说deployment是通过replicaset来管理pod的多个副本的,我们通常不需要直接使用replicaset。
8.daemonset
用于每个node最多只运行一个pod副本的场景。正如其名称所示的,daemonset通常用于运行daemon。
9.statefuleset
能够保证pod的每个副本在整个生命周期中名称是不变的,而其他controller不提供这个功能。当某个pod发生故障需要删除并重新启动时,pod的名称会发生变化,同时statefulset会保证副本按照固定的顺序启动、更新或者删除。、
10.job
用于运行结束就删除的应用,而其他controller中的pod通常是长期持续运行的。
11.service
deployment可以部署多个副本,每个pod 都有自己的IP,外界如何访问这些副本那?
答案是service
k8s的 service定义了外界访问一组特定pod的方式。service有自己的IP和端口,service为pod提供了负载均衡。
k8s运行容器pod与访问容器这两项任务分别由controller和service执行。
12.namespace
可以将一个物理的cluster逻辑上划分成多个虚拟cluster,每个cluster就是一个namespace。不同的namespace里的资源是完全隔离的。
13.kubeadm
用来初始化集群的指令。
14.kubelet
在集群中的每个节点上用来启动 pod 和容器等
15.kubectl
用来与集群通信的命令行工具。通过 kubectl 可以部署和管理应用,查看各种资源,创建、删除和更新各种组件。
16.API Server
提供 REST 操作和到集群共享状态的前端,所有其他组件通过它进行交互。
17.kube-scheduler
主节点上的组件,该组件监视那些新创建的未指定运行节点的 Pod,并选择节点让 Pod 在上面运行。调度决策考虑的因素包括单个 Pod 和 Pod 集合的资源需求、硬件/软件/策略约束、亲和性和反亲和性规范、数据位置、工作负载间的干扰和最后时限。
18 kube-proxy
是集群中每个节点上运行的网络代理,实现 Kubernetes Service 概念的一部分。
19.知名标签(Label)、注解(Annotation)和 污点(Taint)
Kubernetes 保留了 kubernetes.io 命名空间下的所有标签和注解。
20 metadata 元数据
metadata - 帮助唯一性标识对象的一些数据,包括一个 name 字符串、UID 和可选的 namespace等
kubernetes安装
官方文档安装https://kubernetes.io/docs/setup/independent/install-kubeadm/
安装 kubeadm、kubelet 和 kubectl
官网安装: sudo apt-get update && sudo apt-get install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
华为云主机
master 192.168.1.21 2CPU,2G内存
node-0001 192.168.1.31 2CPU,2G内存
node-0002 192.168.1.32 2CPU,2G内存
node-0003 192.168.1.33 2CPU,2G内存
registry 192.168.1.100 1CPU,1G内存
kube-master安装 :方法一
1 优化系统服务
禁用 selinux,禁用 swap,卸载 firewalld-*
[root@master ~]# systemctl stop postfix
[root@master ~]# yum remove -y postfix firewalld-*
[root@master ~]# yum install chrony
[root@master ~]# vim /etc/chrony.conf
#注释掉 server 开头行,添加下面的配置
server ntp.myhuaweicloud.com minpoll 4 maxpoll 10 iburst
[root@master ~]# systemctl enable --now chronyd
[root@master ~]# chronyc sources -v
#验证配置结果 ^* 代表成功
[root@master ~]# vim /etc/cloud/cloud.cfg
#manage_etc_hosts: localhost 注释掉这一行
[root@master ~]# sed -i '/SELINUX/s/enforcing/permissive/' /etc/selinux/config
[root@master ~]# swapoff -a 临时
[root@master ~]# sed -ri 's/ .* /#&/' /etc/fstab
仓库初始化
1.1删除原有云主机,重新购买
主机名称 IP地址 最低配置
registry 192.168.1.100 1CPU,1G内存
1.2、安装仓库服务
[root@registry ~]# yum makecache
[root@registry ~]# yum install -y docker-distribution
[root@registry ~]# systemctl enable --now docker-distribution
1.3、使用脚本初始化仓库
拷贝云盘 kubernetes/v1.17.6/registry/myos目录 到 仓库服务器
[root@registry ~]# cd myos
[root@registry ~]# chmod 755 init-img.sh
[root@registry ~]# ./init-img.sh
[root@registry ~]# curl http://192.168.1.100:5000/v2/myos/tags/list
{"name":"myos","tags":["nginx","php-fpm","v1804","httpd"]}
2、配置yum仓库
跳板机,配置提供yum源
[root@ecs-proxy ~]# cp -a v1.17.6/k8s-install /var/ftp/localrepo/
[root@ecs-proxy ~]# cd /var/ftp/localrepo/
[root@ecs-proxy localrepo]# createrepo --update .
3、安装工具软件包
安装kubeadm、kubectl、kubelet、docker-ce
[root@master ~]# yum makecache
[root@master ~]# yum install -y kubeadm kubelet kubectl docker-ce
[root@master ~]# mkdir -p /etc/docker
[root@master ~]# vim /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://hub-mirror.c.163.com"],
"insecure-registries":["192.168.1.100:5000", "registry:5000"]
}
[root@master ~]# systemctl enable --now docker kubelet
[root@master ~]# docker info |grep Cgroup
Cgroup Driver: systemd
[root@master ~]# vim /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
[root@master ~]# modprobe br_netfilter
[root@master ~]# sysctl --system
4、镜像导入私有仓库
把云盘 kubernetes/v1.17.6/base-images 中的镜像拷贝到 master
[root@master ~]# cd base-images/
[root@master base-image]# for i in *.tar.gz;do docker load -i ${i};done
[root@master base-image]# docker images
[root@master base-image]# docker images |awk '$2!="TAG"{print $1,$2}'|while read _f _v;do
docker tag ${_f}: ${_v} 192.168.1.100:5000/ ${_f##*/}: ${_v};
docker push 192.168.1.100:5000/ ${_f##*/}: ${_v};
docker rmi ${_f}: ${_v};
done
#查看验证
[root@master base-image]# curl http://192.168.1.100:5000/v2/_catalog
5、Tab键设置
[root@master ~]# kubectl completion bash >/etc/bash_completion.d/kubectl
[root@master ~]# kubeadm completion bash >/etc/bash_completion.d/kubeadm
[root@master ~]# bash
6、安装IPVS代理软件包
[root@master ~]# yum install -y ipvsadm ipset
7、系统初始化,排错
[root@master ~]# vim /etc/hosts
192.168.1.21 master
192.168.1.31 node-0001
192.168.1.32 node-0002
192.168.1.33 node-0003
192.168.1.100 registry
[root@master ~]# kubeadm init --dry-run
8、使用kubeadm部署
应答文件在云盘的 kubernetes/v1.17.6/config 目录下
[root@master ~]# mkdir init;cd init
#拷贝 kubeadm-init.yaml 到 master 云主机 init 目录下
[root@master init]# kubeadm init --config=kubeadm-init.yaml |tee master-init.log
创建日志 tee master-init.log
#根据提示执行命令
[root@master init]# mkdir -p $HOME/.kube
[root@master init]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master init]# sudo chown $(id -u): $(id -g) $HOME/.kube/config
9、验证安装结果
[root@master ~]# kubectl version
[root@master ~]# kubectl get componentstatuses
NAME STATUS MESSAGE ERROR
controller-manager Healthy ok
scheduler Healthy ok
etcd-0 Healthy {"health":"true"}
node计算节点安装
1、获取token
删除原有token
[root@master ~]# kubeadm token list
[root@master ~]# kubeadm token delete XXXX(上面list查找到的)
创建token
[root@master ~]# kubeadm token create --ttl=0 --print-join-command
[root@master ~]# kubeadm token list
#获取token_hash
[root@master ~]# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt |openssl rsa -pubin -outform der |openssl dgst -sha256 -hex
2、node安装
拷贝云盘上 kubernetes/v1.17.6/node-install 到跳板机
[root@ecs-proxy ~]# cd node-install/
[root@ecs-proxy node-install]# vim files/hosts
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
192.168.1.21 master
192.168.1.31 node-0001
192.168.1.32 node-0002
192.168.1.33 node-0003
192.168.1.100 registry
[root@ecs-proxy node-install]# vim node_install.yaml
---
- name:
hosts:
- nodes
vars:
master: '192.168.1.21:6443'
token: 'ye99yg.gv866warn6067oox'
token_hash: 'sha256:9fa1341dfce3815cffd64d77968f35cac773ada4f7a71fb73eb28f62ee990002'
tasks:
- name: disable swap
lineinfile:
path: /etc/fstab
regexp: 'swap'
state: absent
notify: disable swap
- name: Ensure SELinux is set to disabled mode
lineinfile:
path: /etc/selinux/config
regexp: '^SELINUX='
line: SELINUX=disabled
notify: disable selinux
- name: remove the firewalld
yum:
name:
- firewalld
- firewalld-filesystem
state: absent
- name: install k8s node tools
yum:
name:
- kubeadm
- kubelet
- docker-ce
- ipvsadm
- ipset
state: present
update_cache: yes
- name: Create a directory if it does not exist
file:
path: /etc/docker
state: directory
mode: '0755'
- name: Copy file with /etc/hosts
copy:
src: files/hosts
dest: /etc/hosts
owner: root
group: root
mode: '0644'
- name: Copy file with /etc/docker/daemon.json
copy:
src: f