1.1 Kubernetes简介
Kubernetes(简称K8S)它是一种开源应用,用于管理云平台上多个主机的容器应用,提供了应用部署、规划、更新和维护的机制。他的核心特征之一是独立管理容器,以确保云平台中的容器按照用户的期望运行(例如,用户希望apache一直运行,用户不用担心怎么做,Kubernetes会自动监控,然后重启,新建,简而言之,让apache始终提供服务)
在Kubernetes所有容器都在中间Pod用户可以,用户可以自己创建和管理Pod。一个Pod它可以携带一个或多个相关容器,同一个容器Pod>在同一物理机器上部署容器并共享资源。一个Pod也可以包括0哥或多个磁盘卷组(volumes),这些卷组将以目录的形式提供给容器,或全部提供Pod对于用户创建的每个容器共享Pod,系统将自动选择具有足够容量的健康机器,然后创建类似容器的容器。当容器创建失败时,容器将被使用node agent自动重启,这个node agent叫kubelet,但是,如果是的话Pod失败
或者机器,除非用户定义,否则不会自动转移和启动 replication controller。
Kubernetes支持特殊的网络模型,Kubernetes它创建了一个地址空间一个不动态的分配端口,允许用户选择任何他们想要使用的端口>为了实现这个功能,每个端口都是Pod分配IP地址。
1.2 Kubernetes架构
kubernetes集群包含节点代理kubelet和master组件(APls ,scheduler,etc)基于分布式存储系统,以下是kubernetes架构图
在这个系统架构图中,我们将服务分为运行在工作节点上的服务和组成集群级控制板的服务。Kubernetes节点有运行应用容器>备的服务,而这些都是受Master控制。当然,每个节点都必须运行Docker。Docker负责所有具体的图像下载和容器操作。
Kubernetes主要由以下核心组件组成:
- etcd保存了整个集群的状态
- apiserver提供认证、授权、访问控制等资源运营的唯一入口API注册和发现等机制
- controller manager负责维护故障检测、自动扩展、滚动更新等集群状态
- scheduler负责资源调度,按照预先制定的调度策略Pod调度到相应的机器
- kubelet负责维护容器的生命周期和生命周期Volume(CVI)和网络(CNI)的管理
- Container runtime负责镜像管理和pod以及容器的真实运行
- kube-proxy负责为service提供cluster内部服务发现与负载平衡
除核心组件外,还推荐一些Add-ons:
- kube-dns负责为整个集群提供服务DNS服务
- Ingress Controller为服务提供外网入口
- Heapster提供资源监控
- Dashboard提供GUI
- Federation提供跨可用区集群
- Fluentd-elasticsearch收集、存储和查询集群日志
1.3 Pod、Node、容器
K8s为每个Pod都分配了唯一的IP地址。称为PodIP。一个Pod多个容器共享Pod IP。K8s底层网络支持集群中的任何两个Pod之间的TCP/IP通常通过二层网络技术实现直接通信(如Flannel、Openswith)。一个Pod容器和其他主机Pod容器可以直接通信
Pod事实上,有两种普通类型Pod及静态的Pod(static Pod)。后者比较特殊,不存放K8S的etcd存储在中间,但存储在某个特定的存储中Node上面的文件只在这里Node上启动操作。而普通的Pod一旦创建,它将被放入etcd存储在中间,然后会被接受K8S Master调度到特定的Node绑定在上面(Binding),随后该Pod被对应的Node上的kubelet进程实例化为一组Docker并启动容器。默认情况下,当Pod当容器停止时,K8S这个问题将自动检测并重新启动Pod(Pod如果所有容器都在里面),Pod所在的Node如果你停下来,你会这样做的Node上的所有Pod重新调度到其它节点。
Pod、Node与容器的关系
1.4资源对象介绍
K8S所有资源对象都可以使用Yaml或JSON格式的文件定义或描述如下Pod资源定义文件
apiSerdion: v1 kind: Pod matadata: name: myweb labels: name: myweb spec: containers: - name: myweb image: kubeguide/tomcat-app:v1 ports: - containerPort: 8080 env: - name: MYSQL_SERVICE_HOST value: 'mysql' - name: MYSQL_SERVICE_PORT value: '3306'
kind为Pod说明这是一个Pod的定义;matadata的name属性为Pod资源对象的名称也可以定义Label,这里声明myweb拥有一个name=myweb的标签。
Pod容器组中包含的定义是spec这里定义了一个名字myweb,镜像为kubeguide/tomcat-app:v注入名为1的容器MYSQL_SERVICE_HOST='mysql'和MYSQL_SERVICE_PORT='3306'的环境变量(env关键字)。Pod的IP加上这里的容器端口(containerPort)构成了一个新概念Endpoint(端口),它代表Pod服务流程对外通信地址。一个Pod也有很多Endpoint的情况,例如,Tomcat定义Pod管理端口和服务端口可以暴露在外Endpoint。
2.部署Kubernetes集群
2.1 节点规划
环境说明(centos7.6 1810镜像)
IP地址 |
主机名 |
角色 |
192.168.200.10 |
Master |
Master |
Node |
worker |
2.2 配置互相通信
# ssh-keygen #生成ssh 密钥对,一路回车,不输入密码
# ssh-copy-id 192.168.200.10 //把本地的ssh公钥文件安装到远程主机对应的账户
# ssh-copy-id 192.168.200.20
2.3 基础环境配置
关闭防火墙和selinux
# systemctl stop firewalld && systemctl disable firewalld
# setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
清除iptables规则
# iptables -F && iptables -X && iptables -Z && iptables-save
关闭swap分区
# swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
配置路由转发
br_netfilter模块用于将桥接流量转发至iptables链,br_netfilter内核参数需要开启转发。
# modprobe br_netfilter
# echo "modprobe br_netfilter" >> /etc/profile
# cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
# sysctl -p /etc/sysctl.d/k8s.conf
2.4 安装docker
配置docker-ce的离线yum源
# tar -zxvf k8s-docker.tar.gz -C /opt/
# tee /etc/yum.repos.d/k8s-docker.repo << 'EOF'
[k8s-docker]
name=k8s-docker
baseurl=file:///opt/k8s-docker
enabled=1
gpgcheck=0
EOF
# scp /etc/yum.repos.d/k8s-docker.repo 192.168.200.20:/etc/yum.repos.d/ //发送给从节点
# scp -r /opt/k8s-docker/ 192.168.200.20:/opt/
# yum install -y yum-utils device-mapper-persistent-data lvm2 //安装依赖包
# yum install docker-ce docker-ce-cli containerd.io -y //安装docker-ce
# systemctl start docker && systemctl enable docker
2.5 安装kubernetes集群
# yum install -y kubelet-1.20.4 kubeadm-1.20.4 kubectl-1.20.4
# systemctl enable kubelet && systemctl start kubelet
注:每个软件包的作用
kubelet :运行在集群所有节点上,用于启动Pod和容器等对象的工具
kubeadm :用于初始化集群,启动集群的命令工具
kubectl :用于和集群通信的命令行,通过kubectl可以部署和管理应用,查看各种资源,创建、删除和更新各种组件
2.6 添加阿里云镜像加速地址并修改docker文件驱动
# tee /etc/docker/daemon.json << 'EOF'
{
"registry-mirrors": ["https://rncxm540.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
# systemctl daemon-reload && systemctl restart docker
2.7 初始化集群
离线导入docker镜像,避免node节点找不到镜像。
# scp -r k8s-images-v1.20.4.tar.gz 192.168.200.20:/root/
# docker load -i k8s-images-v1.20.4.tar.gz
使用kubeadm初始化k8s集群
# kubeadm init --kubernetes-version=1.20.4 \
--apiserver-advertise-address=192.168.200.10 \
--image-repository registry.aliyuncs.com/google_containers \
--service-cidr=10.10.0.0/16 --pod-network-cidr=10.122.0.0/16
注:--image-repository registry.aliyuncs.com/google_containers为保证拉取镜像不到国外站点拉取,手动指定仓库地址为registry.aliyuncs.com/google_containers。kubeadm默认从k8ss.grc.io拉取镜像。 我们本地有导入到的离线镜像,所以会优先使用本地的镜像。
安装完成。
# mkdir -p $HOME/.kube
# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# sudo chown $(id -u):$(id -g) $HOME/.kube/config
# kubectl get nodes //查看集群状态
此时集群状态还是NotReady状态,因为网络组件没有启动。
3.安装网络组件
安装Calico网络组件
//上传calico.yaml,使用yaml文件安装calico 网络插件
# kubectl apply -f /root/calico.yaml
//拉取镜像需要一定时间,所以我们查看pod状态为running则安装成功。
# kubectl get pod --all-namespaces
//再次查看集群状态。
# kubectl get node
4.k8s实战
4.1 实战1——安装kubernetes-dashboard
4.1.1 修改yaml文件
默认的dashboard没有配置NodePort映射
# vi recommended.yaml //在第42行下方添加2行
nodePort: 30000
type: NodePort
4.1.2 添加dashboard管理员用户凭证
在原文件中追加以下内容:
# cat >> recommended.yaml << EOF
---
# ------------------- dashboard-admin ------------------- #
apiVersion: v1
kind: ServiceAccount
metadata:
name: dashboard-admin
namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: dashboard-admin
subjects:
- kind: ServiceAccount
name: dashboard-admin
namespace: kubernetes-dashboard
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
EOF
4.1.3 安装dashboard
# kubectl apply -f recommended.yaml
# kubectl get pods --all-namespaces
4.1.4 查看登录令牌
# kubectl describe secrets -n kubernetes-dashboard dashboard-admin
token: 浏览器登录时使用以上token进行登录。
4.1.5 访问web界面
(推荐使用Firefox浏览器)https://192.168.200.10:30000/
出现此界面需要点击高级,添加例外即可成功跳转并使用token登录
首次登陆可能会比较慢,请勿反复刷新页面。
4.2 实战2——将node节点加入到集群中
4.2.1 在master上查看加入节点命令
# kubeadm token create --print-join-command
4.2.2 把node节点加入k8s集群
# kubeadm join 192.168.200.10:6443 --token 0do153.6z6lypz1sxx6jhux --discovery-token-ca-cert-hash sha256:ab6719610f13e3e872784cde7b7a03e8c600baea6da617aced1ef0a1a05e5056
4.2.3 在node节点上查看集群状态
将master证书导入到node上,这样在node才可以使用kubectl命令管理k8s
# mkdir ~/.kube
拷贝master的配置文件到node
# scp ~/.kube/config 192.168.200.20:/root/.kube/
# kubectl get nodes //查看集群状态
//可以看到node的ROLES角色为空,我们可以手工打上标签,这里不影响集群正常工作。
# kubectl label node node node-role.kubernetes.io/worker=worker
此时访问web界面https://192.168.200.20:30000/也可以访问dashboard界面
4.3 实战3——通过kubernetes-dashboard创建容器
4.3.1 web界面点击+进行创建pod
4.3.2 创建nginx pod
4.3.3 点“Deploy”开始部署。
4.3.4 创建成功
查看分配的nodeport端口
浏览器访问:http://192.168.200.10:30717/ ,http://192.168.200.20:30717/
注:访问master,node都是可以的。
5.配置图形化管理工具Kuboard
Kuboard是一款免费的Kubernetes图形化管理工具,其力图帮助用户快速在Kubernetes上落地微服务。登录Master节点上传kuboard.tar和kuboard.yaml,使用kuboard.yaml文件部署Kuboard。
# docker load < kuboard.tar //导入本地镜像
# vi kuboard.yaml //修改配置文件
# kubectl apply -f kuboard.yaml
在浏览器输入地址http://192.168.200.10:32567/(主从节点IP都可以访问),即可进入Kuboard的认证界面,在Token文本框中输入令牌后可进入Kuboard控制台.