文章目录
一、K8s快速入门
1. 简介
kubernetes简称k8s。是用于自动部署、可移植的、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。 Kubernetes 拥有一个庞大且快速增长的生态系统。Kubernetes 的服务、支持和工具广泛可用。
中文官网:https://kubernetes.io/Zh/
中文社区:https://www.kubernetes.org.cn/
官方文档:https://kubernetes.io/zh/docs/home/
社区文档:https://docs.kubernetes.org.cn/
部署方式的进化:
详细请访问官方文档:https://kubernetes.io/zh/docs/concepts/overview/what-is-kubernetes/
2. 架构
文档:https://kubernetes.io/zh/docs/concepts/overview/components/
1)master节点架构
-
kube-apiserver
- 对外暴露 k8s 的 api 接口,是外界进行资源操作的唯一入口
- 提供认证、授权、访问控制、API 注册和发现等机制
-
etcd
-
etcd
是兼具一致性和高可用性的键值数据库,可以作为保存 Kubernetes 所有集群数据的后台数据库。 - Kubernetes 集群的 etcd 数据库通常需要有个备份计划。
-
-
kube-scheduler
- 主节点上的组件,负责监视新创建的、未指定运行节点(node)的 Pods,并选择节点让 Pod 在上面运行。
- 对所有 k8s 集群的操作,都必须经过主节点进行调度
-
kube-controller-manager
:在主节点上运行控制器进程的组件这些控制器包括:
- 节点控制器(Node Controller): 负责在节点出现故障时进行通知和响应
- 任务控制器(Job controller): 监测代表一次性任务的 Job 对象,然后创建 Pods 来运行这些任务直至完成
- 端点控制器(Endpoints Controller): 填充端点(Endpoints)对象(即加入 Service 与 Pod)
- 服务帐户和令牌控制器(Service Account & Token Controllers): 为新的命名空间创建默认帐户和 API 访问令牌
2)Node节点架构
-
kubelet
- 一个在集群中每个节点(node)上运行的代理。 它保证容器(containers)都运行在 Pod 中。kubelet 接收一组通过各类机制提供给它的 PodSpecs,确保这些 PodSpecs 中描述的容器处于运行状态且健康。 kubelet 不会管理不是由 Kubernetes 创建的容器。
- 负责维护窗口的生命周期,同时也负责 Volume (CSI) 和网络 (CIN) 的管理
-
kube-proxy
- kube-proxy 是集群中每个节点上运行的网络代理, 实现 Kubernetes 服务(Service) 概念的一部分。
- kube-proxy 维护节点上的网络规则。这些网络规则允许从集群内部或外部的网络会话与 Pod 进行网络通信。
-
容器运行时(Container Runtime)
- 容器运行环境是负责运行容器的软件。
- Kubernetes 支持多个容器运行环境:Docker、 containerd、CRI-O 以及任何实现 Kubernetes CRI (容器运行环境接口)。
-
fluentd
- 是一个守护进程,它有助于提供集群层面日志
3. 概念
-
Container
:容器,可以是 docker 启动的一个容器 -
Pod
:- k8s 使用 Pod 来组织一组容器
- 一个 Pod 中的所有容器共享同一网络。
- Pod 是 k8s 中的最小部署单元
-
Volume
:- 声明在 Pod 容器中可访问的文件目录
- 可以被挂载在Pod中一个或多个容器指定路径下
- 支持多种后端存储抽象(本地存储,分布式存储,云存储)
-
Controllers
:更高层次对象,部署和管理Pod;- ReplicaSet:确保预期的 Pod 副本数量
- Deplotment:无状态应用部署
- StatefulSet:有状态应用部署,例如 Mysql
- DaemonSet:确保所有Node都运行一个指定Pod
- Job:一次性任务
- Cronjob:定时任务
-
Deployment
:- .定义一组 Pod 的副本数目、版本等
- 通过控制器 (Controller) 维持 Pod 数目(自动回复失败的 Pod)
- 通过控制器以指定的策略控制版本(滚动升级,回滚等)
-
Service
- 定义一组 Pod 的访问策略
- Pod 的负载均衡,提供一个或者多个 Pod 的稳定访问地址
- 支持多种方式(ClusterlP、 NodePort、 LoadBalance)
-
Label
:标签,用于对象资源的查询,筛选 -
Namespace
:命名空间,逻辑隔离- 一个集群内部的逻辑隔离机制 (鉴权.资源)
- 每个资源都属于一个 namespace
- 同一个 namespace 所有资源名不能重复
- 不同 namespace 可以资源名重复
-
API:我们通过 kubernetes 的 API 来操作整个集群。
- 可以通过 kubectl、ui、curl 最终发送 http+json/yaml 方式的请求给 API Server,然后控制 k8s 集群。k8s 里的所有的资源对象都可以采用
yaml
或JSON
格式的文件定义或描述
- 可以通过 kubectl、ui、curl 最终发送 http+json/yaml 方式的请求给 API Server,然后控制 k8s 集群。k8s 里的所有的资源对象都可以采用
二、K8s集群安装
1. 前置要求
- 准备一台或多台机器,操作系统 Centos7.x-86_x64。我的配置 3 台 Centos7
- 硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB或更多。我的配置 2核 2G 64G
- 集群中所有的机器之间网络互通
- 可以访问外网,需要拉取镜像
2. 配置Linux环境(所有节点都执行)
-
关闭防火墙
systemctl stop firewalld systemctl disable firewalld
-
关闭 selinux
sed -i 's/enforcing/disabled/' /etc/selinux/config setenforce 0
-
关闭swap
swapoff -a #临时关闭 sed -ri 's/.*swap.*/#&/' /etc/fstab #永久关闭 free -g #验证,swap必须为0
-
添加主机名与IP对应关系:
查看主机名:
hostname
如果主机名不正确,可以通过
hostnamectl set-hostname <newhostname>
命令来指定新的hostname
。我的三台节点名:k8s-node1,k8s-node2,k8s-node3在三台机器中配置
/etc/hosts
以便可以互相通过hostname
访问vim /etc/hosts 10.211.55.19 k8s-node1 # 这里的IP要修改成hostname对应节点的IP 10.211.55.21 k8s-node2 10.211.55.20 k8s-node3
-
将桥接的 IPV4 流量传递到 iptables 的链:
cat > /etc/sysctl.d/k8s.conf <<EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF
应用规则:
sysctl --system
-
date
查看时间(可选)
yum -y install ntpupdate
ntpupdate time.window.com #同步最新时间
3. 所有节点安装 docker、kubeadm、kubelet、kubectl
Kubenetes 默认 CRI(容器运行时)为 Docker,因此先安装 Docker。
1)安装Docker
-
卸载之前的docker
$ sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine
-
安装Docker -CE
$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2 # 设置 docker repo 的 yum 位置 $ sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo $ sudo yum -y install docker-ce docker-ce-cli containerd.io
-
配置镜像加速
registry-mirrors
后面使用自己的镜像加速地址,可以从阿里云镜像加速器获取sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m" }, "registry-mirrors": ["https://r1fl0qlt.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker
-
启动 Docker 并且设置 Docker 开机启动
sudo systemctl enable docker
2)添加阿里与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
3)安装 kubeadm,kubelet 和 kubectl
安装
yum install -y kubelet-1.17.3 kubeadm-1.17.3 kubectl-1.17.3
开机启动
systemctl enable kubelet && systemctl start kubelet
查看kubelet的状态:
systemctl status kubelet
查看 kubelet 版本:
> kubelet --version
Kubernetes v1.17.3
4)部署k8s-master
(1)master节点初始化
初始化 kubeadm,下面的命令会下载 k8s 组件的镜像:
$ kubeadm init \
--apiserver-advertise-address=10.211.55.19 \
--image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
--kubernetes-version v1.17.3 \
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=10.244.0.0/16
参数说明:
-
--apiserver-advertise-address
:这里的IP地址要修改成自己master
主机的地址,我使用的是为三台机器中的第一台k8s-node1
; -
--kubernetes-version
:配置成自己安装的版本,和上一步kubeadm
的版本一致,kubelet --version
查看版本
注意:如果执行上面的初始化命令报错了,下次再执行初始化命令前,先执行
kubeadm reset -f
执行结果:
如果看到下面的页面,则说明初始化成功
初始化完节点之后,根据日志的提示先执行这三条命令:
# 这个目录会保存连接配置
mkdir -p $HOME/.kube
# 认证文件保存到这个目录下
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
(2)安装 flannel
安装CNI网络插件,这里安装 flannel
创建个 flannel 的目录,
-
下载 yml 文件:
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
如果上面的网址下载不下来,就去 码云 flannel 上把这个 yml 文件复制或者下载下来
-
创建 flannel
kubectl create -f kube-flannel.yml
-
查看是否成功运行
可以看到kube-flannel
是运行状态:[root@k8s-node1 flannel]# kubectl get pods --all-namespaces NAMESPACE NAME READY STATUS RESTARTS AGE kube-system coredns-7d89d9b6b8-bjmsp 1/1 Running 0 36m kube-system coredns-7d89d9b6b8-z46zp 1/1 Running 0 36m kube-system etcd-k8s-node1 1/1 Running 1 37m kube-system kube-apiserver-k8s-node1 1/1 Running 1 37m kube-system kube-controller-manager-k8s-node1 1/1 Running 1 37m kube-system kube-flannel-ds-srf9w 1/1 Running 0 65s kube-system kube-proxy-n64fp 1/1 Running 0 36m kube-system kube-scheduler-k8s-node1 1/1 Running 1 37m
5)添加从节点
-
查看所有节点(主节点运行)
#获取所有节点 $ kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-node1 Ready control-plane,master 40m v1.22.2
-
获取 Node 节点加入命令
$ kubeadm token create --print-join-command kubeadm join 10.37.132.5:6443 --token yzd8bg.mzdp8ua5cyuggpdp --discovery-token-ca-cert-hash sha256:71216e7189e48bfedac9fce79c9dd6920b3354ff62023e7ea069848fa84a3861
-
在从节点运行输出的命令
$ kubeadm join 10.37.132.5:6443 --token yzd8bg.mzdp8ua5cyuggpdp --discovery-token-ca-cert-hash sha256:71216e7189e48bfedac9fce79c9dd6920b3354ff62023e7ea069848fa84a3861
-
查看节点状态
$ kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-node1 Ready control-plane,master 68m v1.22.2 k8s-node2 Ready <none> 4m16s v1.22.2 k8s-node3 Ready <none> 4m12s v1.22.2
$ journalctl -u kubelet #查看kubelet日志
监控pod进度
watch kubectl get pod -n kube-system -o wide
等到所有的status都变为running状态后,再次查看节点信息:
[root@k8s-node1 ~]# kubectl get nodes; NAME STATUS ROLES AGE VERSIONk8s-node1 Ready master 3h50m v1.17.3k8s-node2 Ready <none> 3h3m v1.17.3k8s-node3 Ready <none> 3h3m v1.17.3[root@k8s-node1 ~]#
三、入门操作kubernetes集群
1. k8s上部署一个tomcat
kubectl create deployment tomcat6 --image=tomcat:6.0.53-jre8
其它命令:
# 获取所有的资源
$ kubectl get all
# 获取所有资源的详细信息
$ kubectl get all -o wide
# 获取 pods 的信息
kubectl get pods
2. 向外暴露端口
在master上执行
kubectl expose deployment tomcat6 --port=80 --target-port=8080 --type=NodePort
-
--port=80
:pod 中的端口 80 映射;server 会带来 pod 的 80 -
--target-port=8080
:容器中的端口 8080,会与 pod 中的 80 映射 -
--type=NodePort
:Service 的一种类型,为 Service 在每台机器上绑定一个端口,这样就可以通过NodeIp:NodePort
来访问该服务
查看服务,访问 k8s-node1:30916
(30916 是service自动分配的,服务器的 30916 端口,映射 pod 中的 80 端口)就可以访问到 tomcat :
# 查看 service 的信息
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 91m
tomcat6 NodePort 10.96.96.4 <none> 80:30916/TCP 12s
3. 动态扩容测试
# 查看deployment,只有一个副本
$ kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
tomcat6 1/1 1 1 8m44s
# 扩容成3个副本
$ kubectl scale --replicas=3 deployment tomcat6
deployment.apps/tomcat6 scaled
# 可以看到正在扩容中
$ kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
tomcat6 2/3 3 2 9m35s
4. 删除
$ kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
tomcat6 3/3 3 3 12m
$ kubectl delete deployment tomcat6
deployment.apps "tomcat6" deleted
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 91m
tomcat6 NodePort 10.96.96.4 <none> 80:30916/TCP 12s
$ kubectl delete service tomcat6
service "tomcat6" deleted
5. 格式化输出 yaml
# 打印前面部署 Tomcat 时使用的命令对应的 yaml
$ kubectl create deployment tomcat6 --image=tomcat:6.0.53-jre8 --dry-run='client' -o=yaml
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: tomcat6
name: tomcat6
spec:
replicas: 1
selector:
matchLabels:
app: tomcat6
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: tomcat6
spec:
containers:
- image: tomcat:6.0.53-jre8
name: tomcat
resources: {}
status: {}
-
--dry-run
:值必须为none
(默认)、server
或client
。如果是client
策略,则只打印该发送对象,但不发送它。如果server
策略,提交服务器端请求而不持久化资源。 -
-o
:输出格式,可以是json
、yaml
、wide
等等。
6. 使用 yaml 部署 tomcat
-
使用前一步打印的
yaml
,删除一些无用配置,将replicas
改成3
,使用yaml
文件部署3
台Tomcat
apiVersion: apps/v1 kind: Deployment metadata: labels: app: tomcat6 name: tomcat6 spec: replicas: 3 selector: matchLabels: app: tomcat6 template: metadata: labels: app: tomcat6 spec: containers: - image: tomcat:6.0.53-jre8 name: tomcat
-
将上面的 yaml 保存至一个文件中
tomcat6.yaml
$ kubectl apply -f tomcat6.yaml
-
apply
:表示创建或者更新资源,删除则用delete
-
-f
:指定指定 yaml 文件
查看 pod 的 yaml:
# 查看 pod $ kubectl get pods NAME READY STATUS RESTARTS AGE tomcat6-56fcc999cb-b4nt7 1/1 Running 0 2m49s tomcat6-56fcc999cb-pncn9 1/1 Running 0 2m49s tomcat6-56fcc999cb-wczpj 1/1 Running 0 2m49s # 查看 pod 的 yaml $ kubectl get pods tomcat6-56fcc999cb-b4nt7 -o yaml
-
-
删除用
yaml
创建的 Tomcat$ kubectl delete -f tomcat6.yaml
7. 一些官方文档
1)kubectl 操作文档
https://kubernetes.io/zh/docs/reference/kubectl/overview/
2)资源类型
https://kubernetes.io/zh/docs/reference/kubectl/overview/#%e8%b5%84%e6%ba%90%e7%b1%bb%e5%9e%8b