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地址。
kubernetes集群包含有节点代理kubelet和master组件(APls ,scheduler,etc)基于分布式的存储系统,下面这张是kubernetes架构图
在这张系统架构图中,我们把服务分为运行在工作节点上的服务和组成集群级别控制板的服务。Kubernetes节点有运行应用容器必>备的服务,而这些都是受Master的控制。每次个节点上当然都要运行Docker。Docker来负责所有具体的映像下载和容器运行。
Kubernetes主要由以下几个核心组件组成:
除了核心组件,还有一些推荐的Add-ons:
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与容器的关系
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:v1的容器,该容器注入了名为MYSQL_SERVICE_HOST='mysql'和MYSQL_SERVICE_PORT='3306'的环境变量(env关键字)。Pod的IP加上这里的容器端口(containerPort)就组成了一个新的概念Endpoint(端口),它代表Pod的一个服务进程对外的通信地址。一个Pod也存在着具有多个Endpoint的情况,例如,Tomcat定义Pod时,可以暴露管理端口和服务端口这两个Endpoint。
环境说明(centos7.6 1810镜像)
IP地址 |
主机名 |
角色 |
192.168.200.10 |
Master |
Master |
192.168.200.20 |
Node |
worker |
# ssh-keygen #生成ssh 密钥对,一路回车,不输入密码
# ssh-copy-id 192.168.200.10 //把本地的ssh公钥文件安装到远程主机对应的账户
# ssh-copy-id 192.168.200.20
# systemctl stop firewalld && systemctl disable firewalld
# setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
# 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 <
配置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
# 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可以部署和管理应用,查看各种资源,创建、删除和更新各种组件
# 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
离线导入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状态,因为网络组件没有启动。
//上传calico.yaml,使用yaml文件安装calico 网络插件
# kubectl apply -f /root/calico.yaml
//拉取镜像需要一定时间,所以我们查看pod状态为running则安装成功。
# kubectl get pod --all-namespaces
//再次查看集群状态。
# kubectl get node
默认的dashboard没有配置NodePort映射
# vi recommended.yaml //在第42行下方添加2行
nodePort: 30000
type: NodePort
在原文件中追加以下内容:
# 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
# kubectl apply -f recommended.yaml
# kubectl get pods --all-namespaces
# kubectl describe secrets -n kubernetes-dashboard dashboard-admin
token: 浏览器登录时使用以上token进行登录。
(推荐使用Firefox浏览器)https://192.168.200.10:30000/
出现此界面需要点击高级,添加例外即可成功跳转并使用token登录
首次登陆可能会比较慢,请勿反复刷新页面。
# kubeadm token create --print-join-command
# kubeadm join 192.168.200.10:6443 --token 0do153.6z6lypz1sxx6jhux --discovery-token-ca-cert-hash sha256:ab6719610f13e3e872784cde7b7a03e8c600baea6da617aced1ef0a1a05e5056
将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界面
查看分配的nodeport端口
浏览器访问:http://192.168.200.10:30717/ ,http://192.168.200.20:30717/
注:访问master,node都是可以的。
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控制台.