基础介绍

概念

本质是一组服务器集群,在集群每个节点上运行特定的程序,来对节点中的容器进行管理。实现资源管理的自动化。

功能

  • 自我修复
  • 弹性伸缩
  • 服务发现
  • 负载均衡
  • 版本回退
  • 存储编排

组件

  • 控制节点(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_CIDR
  value: "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

示例

pod

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: NodePort
 ports:
   - port: 443
     targetPort: 8443
     nodePort: 31001
 selector:
   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-admin

kubectl 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-dashboard

contaiiners下 args参数

新增 --token-ttl=43200


#日志
kubectl logs -f -n kubernetes-dashboard kubernetes-dashboard-7b544877d5-r4jjw

token
在这里插入图片描述
示意图

常用命令

# 获得节点
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 kubelet

systemctl 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: dev
 labels:
   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: nginx
 name: nginx-deployment1
 namespace: dev
spec:
 replicas: 3
 selector:
   matchLabels:
     app: nginx
 template:
   metadata:
     labels:
       app: nginx
   spec:
     containers:
     - image: nginx:1.14.0
       ports:
       - containerPort: 80
       name: nginx

以下参数自定义时可选

   spec:
     containers:
     - image: nginx:1.14.0
       ports:
       - containerPort: 80
       name: nginx
       volumeMounts: #k8s的master服务器对应的路径,必须存在
       - name: conf
         mountPath: /etc/nginx/nginx.conf
       - name: log
         mountPath: /var/log/nginx
       - name: html
         mountPath: /etc/nginx/html
     tolerations:
     - 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/logs
         type: Directory
     - name: html #和volumeMounts中的内容要对应
       hostPath:
         path: /Users/w/kube/nginx/html
         type: Directory

名词:

kind: Deployment表示yaml文件创建的是一个Deployment发布
metadata表示这个deployment的元信息
metadata.name 是deployment的名称 nginx-deployment1
metadata.labels 是deployment的标签 即:app=nginx
metadata.namespace 是deployment的命名空间,此处选择的是第一步创建的命名空间nginx

spec: 表示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: nginx
 name: nginx-deployment1
 namespace: dev
spec:
 ports:
 - port: 9000
   protocol: TCP
   targetPort: 80
   nodePort: 31090
 selector:
   app: nginx
 type: 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.d

cat > /etc/cni/net.d/10-flannel.conflist << EOF
{
  "name": "cbr0",
  "plugins": [
    {
      "type": "flannel",
      "delegate": {
        "hairpinMode": true,
        "isDefaultGateway": true
      }
    },
    {
      "type": "portmap",
      "capabilities": {
        "portMappings": true
      }
    }
  ]
}
EOF

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐