基础介绍
概念
本质是一组服务器集群,在集群每个节点上运行特定的程序,来对节点中的容器进行管理。实现资源管理的自动化。
功能
- 自我修复
- 弹性伸缩
- 服务发现
- 负载均衡
- 版本回退
- 存储编排
组件
- 控制节点(master)-控制平面
APIserver:资源操作的唯一入口
scheduler :集群资源调度,将Pod调度到node节点上
controlManager:维护集群状态,程序部署状态
Etcd:存储各种资源对象信息(数据库-可替换)
- 工作节点(node)-数据平面,提供数据环境
Kubelet:负责维护生命周期,创建、更新、销毁docker容器
Docker:容器操作
KuberProxy:集群内部服务发现和负载均衡
概念
Master:控制节点
Node:工作节点
Pod: 最小工作单元,容器运行在pod上
Controller:控制器,实现对pod的管理
Service:pod的统一入口
Label:标签,对pod分类
Namespace:命名空间,隔离pod环境
工作流程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HMDSFZa4-1689145689993)(C:\Users\ricar\AppData\Roaming\Typora\typora-user-images\image-20230618235232615.png)]
集群搭建
类型:
一主多从
多主多从
基于三台机器搭建集群
环境配置
IP
192.168.1.220 ricardo-1 #主节点 192.168.1.221 ricardo-2 #从节点 192.168.1.222 ricardo-3 #从节点
关闭防火墙
#临时关闭 systemctl stop firewalld #永久关闭 systemctl disable firewalld
关闭selinux
#永久关闭 sed -i '/selinux/s/enforcing/disabled/' /etc/selinux/config #临时关闭 setenforce 0
关闭swap分区
# 临时关闭 swapoff -a # 注释到swap那一行 永久关闭 vim /etc/fstab
设置主机名称
hostnamectl set-hostname ricardo-1 hostnamectl set-hostname ricardo-2 hostnamectl set-hostname ricardo-3
添加主机名与IP对应关系(三台主机都执行)
cat >> /etc/hosts << EOF 192.168.1.220 ricardo-1 192.168.1.221 ricardo-2 192.168.1.222 ricardo-3 EOF
将桥接的IPv4流量传递到iptables的链(三台主机都执行):
cat > /etc/sysctl.d/k8s.conf << EOF net.ipv4.ip_forward = 1 net.ipv4.tcp_tw_recycle = 0 net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF
sysctl --system
时间同步
yum install ntpdate -y ntpdate time.windows.com
Docker安装
安装需要的软件包, yum-util 提供yum-config-manager功能
yum install -y yum-utils device-mapper-persistent-data lvm2
设置 yum 源(阿里云)
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
选择docker版本并安装
yum list docker-ce --showduplicates | sort -r
安装
sudo yum install -y docker-ce-19.03.0 docker-ce-cli-19.03.0
配置镜像加速
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' {"exec-opts": ["native.cgroupdriver=systemd"],"registry-mirrors": ["https://5w5kf152.mirror.aliyuncs.com"] } EOF
启动 Docker 并设置开机自启
systemctl restart docker && systemctl enable docker
K8s安装
添加阿里云 yum 源(都安装)
cat > /etc/yum.repos.d/kubernetes.repo << EOF [Kubernetes] name=kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=0 repo_gpgcheck=0 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF
kubeadm、kubelet、kubectl 的安装(都安装)
版本对应关系
k8s与docker版本对应关系
#下载软件 yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0#开机自启动 systemctl enable kubelet
在 Master 节点中部署集群-
(只在master节点执行)
kubeadm init --kubernetes-version=1.18.0 \ --apiserver-advertise-address=192.168.1.220 \ --image-repository registry.aliyuncs.com/google_containers \ --service-cidr=10.10.0.0/16 --pod-network-cidr=10.122.0.0/16
开启 kubectl 工具的使用(
该命令在master节点中执行
)mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
将 node 节点加入 master 中的集群(
该命令在工作节点node中执行
)。kubeadm join 192.168.1.220:6443 --token 88gcei.gmh12c7jmh6ksgj6 \--discovery-token-ca-cert-hash sha256:8a3f8919183a5ff0fe8626615195a044a74b0ea3a004e41c013095d28eea83dc #重新创建 kubeadm token create --print-join-command
安装网络插件(CNI) 下面两个中选一个,
calico
# 下载calico插件的yaml wget https://docs.projectcalico.org/v3.14/manifests/calico.yaml --no-check-certificate#修改定义pod网络CALICO_IPV4POOL_CIDR的值 vim calico.yaml # 修改定义pod网络CALICO_IPV4POOL_CIDR的值和kubeadm init pod-network-cidr的值一致 ## 取消注释 - name: CALICO_IPV4POOL_CIDRvalue: "10.122.0.0/16"kubectl apply -f calico.yaml#查看运行状态 kubectl get pods -n kube-system[root@ricardo-1 k8s]# kubectl get nodes NAME STATUS ROLES AGE VERSION ricardo-1 Ready master 43m v1.18.0 ricardo-2 Ready <none> 41m v1.18.0 ricardo-3 Ready <none> 41m v1.18.0
fannel(如果用了上面的calico就不要用这个了)
# 下载flannel插件的yml wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml# 修改kube-flannel.yml中的镜像仓库地址为国内源 sed -i 's/quay.io/quay-mirror.qiniu.com/g' kube-flannel.yml# 安装网络插件 kubectl apply -f kube-flannel.yml
控制台-dashboard 安装
安装
#版本地址 https://github.com/kubernetes/dashboard/releases?page=1#下载配置文件 wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.4/aio/deploy/recommended.yaml#修改 39行 spec:type: NodePortports:- port: 443targetPort: 8443nodePort: 31001selector:k8s-app: kubernetes-dashboard#启动 kubectl apply -f recommended.yaml#查看 kubectl get pods -n kubernetes-dashboard#打开网页 https://192.168.1.220:31001/ 鼠标点击空白处,输入:thisisunsafe #服务器生成token(master节点)#1、创建账号 kubectl create serviceaccount dashboard-admin -n kubernetes-dashboard#2、创建集群角色权限绑定 kubectl create clusterrolebinding kube-dashboard-admin --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:dashboard-admin#3、获取账号token kubectl get secret -n kubernetes-dashboard | grep dashboard-adminkubectl describe secrets dashboard-admin-token-zcvnc -n kubernetes-dashboard#token 粘到 web端 eyJhbGciOiJSUzI1NiIsImtpZCI6InE5NHpxbWhwc0FmVjhhSUZ4bElhZ19JbXVfSXpPNkFhVHFyUE9vc1A5MkUifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4temN2bmMiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiMTc5YjdmYzItOWU2Ny00MTcwLThkYmYtZGJlODU0MzNhM2MxIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmVybmV0ZXMtZGFzaGJvYXJkOmRhc2hib2FyZC1hZG1pbiJ9.f_klKo1n-5cg0UEFodRojtd5hTs3BTL6tFNi0G6aZWalyJuQioodkM3pW1I2d7HaIaKP61XJPRyq9YZEQp9SHsa_guCXMF83JmF5yG8G0hAQbDWyO7DnaFnoGK1RcaH5PioyVOrCOZEYwzwEPtObeXeqnVzNFI4kR1cfIpRefpuhm8dKP06PNpiQRMhLPXWThw1LmCL0OmnPlKyVJJNi2toPS7jxG3LFMhJZR_DA3jOf9kFUXL_v29V2cRzRIU1_cN0t3wsmrPahV3D7LlHAnLVRaV6L-C6X5_l88WwDebDTm4Ag20MLLRE5zeLq6lFh38FWy86IOivinSavysWuwA#修改token持续时间(默认 15分钟 600s) 修改命名空间 kubernetes-dashboard deployment kubernetes-dashboardcontaiiners下 args参数新增 --token-ttl=43200#日志 kubectl logs -f -n kubernetes-dashboard kubernetes-dashboard-7b544877d5-r4jjw
常用命令
# 获得节点
kubectl get nodes#查看pod
kubectl get pods -A
kubectl get pods -n kube-system
kubectl get pod -n kube-system -o wide#pod状态
kubectl describe pod coredns-57d4cbf879-xgk2f -n kube-system
kubectl logs -f coredns-57d4cbf879-xgk2f -n kube-system#查看状态
systemctl status kubeletsystemctl status kubelet.service --now#日志 - 节点日志
journalctl -f -u kubelet
journalctl -u kubelet#开机自启动
systemctl enable kubelet
#重启
systemctl restart kubelet
#查看状态
systemctl status kubelet#查看命名空间
kubectl get ns#创建空间
kubectl create namespace dev#重置
kubeadm reset
#reset后删除
rm -rf $HOME/.kube# 查看k8s的pod网段和svc网段 kubeadm的配置信息存在config-map中
kubectl -n kube-system describe cm kubeadm-config |grep -i pod
# 查看pod网段和svc网段
kubectl -n kube-system describe cm kubeadm-config |grep -i net
部署第一个应用-Nginx
基础介绍
概念
- Namespace 表示命名空间:应用需在命名空间下
- Deployment :即发布pod,因为pod是最小单位
- Service: 暴露服务到外部的方式,包括LoadBlancer Service、NodePort Service、Ingress,即配置一个对外访问的入口
基础流程
因此,部署应用的步骤基本是 先创建命名空间, 再创建pod,再创建service
1、创建命名空间
文件:nginx-namespace.yaml
apiVersion: v1 kind: Namespace metadata:name: devlabels:name: dev
名词:
kind:Namespace 表示yaml文件创建的是命名空间
metadata表示命名空间的元信息
metadata.name 是命名空间的名称 取值dev
metadata.labels 是命名空间的标签 name=dev
应用
kubectl create -f namespace-dev.yaml
2、创建Deployment
文件:deployment-nginx.yaml
apiVersion: apps/v1 kind: Deployment metadata:labels:app: nginxname: nginx-deployment1namespace: dev spec:replicas: 3selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- image: nginx:1.14.0ports:- containerPort: 80name: nginx
以下参数自定义时可选
spec:containers:- image: nginx:1.14.0ports:- containerPort: 80name: nginxvolumeMounts: #k8s的master服务器对应的路径,必须存在- name: confmountPath: /etc/nginx/nginx.conf- name: logmountPath: /var/log/nginx- name: htmlmountPath: /etc/nginx/htmltolerations:- key: "key"operator: "Equal"value: "nginx"effect: "NoSchedule"volumes: #k8s的node对应的路径- name: conf #和volumeMounts中的内容要对应hostPath:path: /Users/w/kube/nginx/conf/nginx.conf- name: log #和volumeMounts中的内容要对应hostPath:path: /Users/w/kube/nginx/logstype: Directory- name: html #和volumeMounts中的内容要对应hostPath:path: /Users/w/kube/nginx/htmltype: Directory
名词:
kind: Deployment表示yaml文件创建的是一个Deployment发布
metadata表示这个deployment的元信息
metadata.name 是deployment的名称 nginx-deployment1
metadata.labels 是deployment的标签 即:app=nginx
metadata.namespace 是deployment的命名空间,此处选择的是第一步创建的命名空间nginxspec: 表示deployment的详细参数配置说明
spec.replicas 是启动几个pod节点
spec.template.spec 是deployment选择模块的详细说明
spec.template.spec.containers 表示选择的容器是什么,此处是nginx的docker镜像 nginx:1.14.0,容器的端口设置 containerPort: 80, volumeMounts表示绑定的文件和目录spec.template.spec.volumes 表示选择的容器挂载的宿主机的文件和目录 conf, log和html
应用:
kubectl create -f deployment-nginx.yaml #初次创建 kubectl apply -f deployment-nginx.yaml #后期更新#查看 kubectl get pods -n dev kubectl describe pod nginx-deployment1-6cb86fb6b7-kkpbw -n dev kubectl delete pod nginx-deployment1-6cb86fb6b7-txkkj -n dev kubectl describe deployment nginx -n dev
3、创建service
文件:service-nginx.yaml
apiVersion: v1 kind: Service metadata:labels:app: nginxname: nginx-deployment1namespace: dev spec:ports:- port: 9000protocol: TCPtargetPort: 80nodePort: 31090selector:app: nginxtype: NodePort
名词:
kind: Service表示yaml文件创建的是一个Service
metadata表示这个Service的元信息
metadata.name 是Service的名称 nginx-deployment1
metadata.labels 是Service的标签 即:app=nginx
metadata.namespace 是Service的命名空间,此处选择的是第一步创建的命名空间nginx
sepc是Service的详细配置说明
sepc.type 取值NodePort 表示这个Service的类型是一个节点端口转发类型
sepc.selector 表示这个Service是将带标签的哪些pods做为一个集合对外通过服务
sepc.ports.port 是Service绑定的端口
sepc.ports.name: nginx-service80 表示Service服务的名称
sepc.ports.protocol: TCP 表示Service转发请求到容器的协议是TCP,我们部署的http的nginx服务,因此选择协议为TCP
sepc.ports.targetPort: 80 表示Service转发外部请求到容器的目标端口80,即deployment的pod容器对外开放的容器端口80
sepc.ports.nodePort: 31090 表示Service对外开放的节点端口应用
kubectl apply -f service-nginx.yaml#查看 kubectl get services -n dev kube kubectl describe service nginx-deployment1 -n nginx kubectl delete services nginx-deployment1 -n nginx
4、测试
地址
192.168.1.220:31090
效果:
报错解决
错误描述 dial tcp 10.96.0.1:443: connect: no route to host
- systemctl stop docker
- systemctl stop kubelet
- iptables --flush
- iptables -tnat --flush
- systemctl start kubelet
- systemctl start docker
错误 Unable to update cni config: No networks found in /etc/cni/net.d
mkdir -p /etc/cni/net.dcat > /etc/cni/net.d/10-flannel.conflist << EOF {"name": "cbr0","plugins": [{"type": "flannel","delegate": {"hairpinMode": true,"isDefaultGateway": true}},{"type": "portmap","capabilities": {"portMappings": true}}] } EOF