Kubernetes集群搭建

Kubernetes集群搭建

目录



前言

本文指定Docker与K8s版本,保证兼容性,可供参考

  • Docker‐ce‐3:19.03.9‐3.el7.x86_64
  • Kubelet‐1.18.0
  • Kubeadm‐1.18.0
  • Kubectl‐1.18.0



前期准备

  • 三台双核4GB内存,centos7+操作系统的虚拟机
    • 192.168.***.133
    • 192.168.***.134
    • 192.168.***.135
  • 三台虚拟机安装Docker (详见附录1)


K8S集群安装



虚拟机设置

三台虚拟机执行以下命令

# 1.关闭防火墙
systemctl stop firewalld
systemctl disable firewalld

# 2.关闭 selinux
sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久关闭(或者选择permissive宽容模式,disable在aarch64架构虚拟机开机docker无法运行)  
setenforce 0 # 临时关闭

# 3.关闭 swap
swapoff -a # 临时关闭
vim /etc/fstab # 永久关闭
#注释掉swap这行
# /dev/mapper/centos‐swap swap swap defaults 0 0
systemctl reboot #重启生效
free -m #查看下swap交换区是否都为0,如果都为0则swap关闭成功

# 4.给三台机器分别设置主机名
hostnamectl set-hostname <hostname>
# 第一台:k8smaster
# 第二台:k8snode1
# 第三台:k8snode2

# 5.在k8s‐master机器添加hosts,执行如下命令,ip需要修改成你自己机器的ip
cat >> /etc/hosts << EOF
192.168.***.133 k8s-master
192.168.***.134 k8s-node1
192.168.***.135 k8s-node2
EOF

sysctl --system # 生效

# 6.将桥接的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 -p  /etc/sysctl.d/k8s.conf

# 7.设置时间同步
yum install ntpdate -y
ntpdate time.windows.com



安装K8S集群

# 1、设置k8s yum源  
# x86: https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
# aarch64: https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-aarch64
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-aarch64
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

# 2、如果之前安装过k8s,先卸载旧版本
yum remove -y kubelet kubeadm kubectl

# 3、查看可以安装的版本
yum list kubelet --showduplicates | sort -r

# 4、安装kubelet、kubeadm、kubectl 指定版本,我们使用kubeadm方式安装k8s集群
# 此处出现的问题:附录二
yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0

# 5、开机启动kubelet
systemctl enable kubelet

# 6、在k8s-master机器上执行初始化操作(里面的第一个ip地址就是k8s-master机器的ip,改成你自己机器的,后面两个ip网段不用动)
# 此处出现的问题: 附录四
kubeadm init --apiserver-advertise-address=192.168.***.133 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.18.0 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16 --ignore-preflight-errors=Swap

# 7.启动k8s (启动失败现象,附录三)
systemctl start kubelet
# 查看启动状态
systemctl status kubelet -l 
# 查看启动日志
journalctl -xefu kubelet

# 在k8s-master上配置使用 kubectl 命令工具(类似docker这个命令),
 mkdir -p $HOME/.kube
 sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
 sudo chown $(id -u):$(id -g) $HOME/.kube/config

#查看kubectl是否能正常使用
kubectl get nodes

#安装 Pod 网络插件
kubectl apply -f https://docs.projectcalico.org/v3.10/manifests/calico.yaml
# 如果上面这个calico网络插件安装不成功可以试下下面这个
# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kubeflannel.yml
# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml


## 将node节点加入进master节点的集群里 (三台机器都执行)
kubeadm join 192.168.145.133:6443 --token xiwdb1.ivwp175n7l2c7mad \
    --discovery-token-ca-cert-hash sha256:7ff5423635326f54a5b901f4caec367170fa6d2f29fe095434d5d42d6f0bfe93

kubeadm init 成功
在这里插入图片描述

kubeadm join 192.168.145.133:6443 --token xiwdb1.ivwp175n7l2c7mad \
    --discovery-token-ca-cert-hash sha256:7ff5423635326f54a5b901f4caec367170fa6d2f29fe095434d5d42d6f0bfe93



k8s部署Nginx

在k8smaster上执行:

# 创建一次deployment部署
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort

# 查看Nginx的pod和service信息
kubectl get pod,svc -o wide

启动成功:
在这里插入图片描述
访问Nginx地址: http://任意node节点的ip:图中Nginx的对外映射端口,http://192.168.***.134:32127
在这里插入图片描述



kubectl命令的使用

kubectl是apiserver的客户端工具,工作在命令行下,能够连接apiserver实现各种增删改等操作 kubectl官方使用文档:https://kubernetes.io/zh/docs/reference/kubectl/overview/

常用命令

# 使用 kubectl create deployment 命令可以创建一个应用部署deployment与Pod
#my‐tomcat表示pod的名称 ‐‐image表示镜像的地址 
kubectl create deployment my‐tomcat --image=tomcat:7.0.75-alpine

# 查看deployment信息
kubectl get deployment

# Pod相关命令:
# 查看pod信息 -o wide 表示详细信息显示
kubectl get pod -o wide
# -w 一直等待观察pod信息变动
kubectl get pod -w
# 查看pod打印的日志
kubectl logs (pod名称)
# exec可以进入pod容器
# env命令可以查看环境变量
kubectl exec (pod名称) -- env
# ls查看容器根目录下内容
kubectl exec (pod名称) -- ls
# sh进入容器
kubectl exec (pod名称) -- sh
# 删除pod
kubectl delete pod (pod名称)

# service 相关命令:
# 创建service
kubectl expose deployment my‐tomcat --name=tomcat --port=8080 --type=NodePort
# 查看service信息
kubectl get svc -o wide

# 扩、缩容
# 扩容到5个pod,如果缩容到3个就是--replicas=3
kubectl scale --replicas=5 deployment my-tomcat(这里my-tomcat是deployment name)

# 滚动升级与回滚
# 滚动升级:
kubectl set image deployment my‐tomcat tomcat=tomcat:8.0.41-jre8-alpine
# 查看某个pod的详细信息
kubectl describe pod pod名称
# 版本回滚:
# 查看历史版本
kubectl rollout history deploy my-tomcat
# 回滚到上一版本  后面增加--to-reversion 参数可以指定回滚版本
kubectl rollout undo deployment my-tomcat


# 标签的使用 Label
# 通过Label查询pod、service
kubectl get pods -l app=my-tomcat
kubectl get services -l app=my-tomcat
# 给pod添加label,label为version=v1
kubectl label pod pod名称 version=v1
# 通过label删除服务
kubectl delete service -l app=test-service



资源清单

之前我们直接用命令创建deployment,pod,service这些资源,其实在k8s中,我们一般都会使用yaml格式的文件来创建符合我们预期期望的资源,这样的yaml文件我们一般称为资源清单。

用yaml创建deployment资源的对象

  • 第一步: 我们可以使用以下命令来获取已经部署的资源清单yaml

kubectl create deployment my-tomcat --image=tomcat:7.0.75-alpine --dry-run -o yaml

在这里插入图片描述

  • 第二步: 创建yaml文件 deployment-demo.yaml
# 如果没有给定group名称,那么默认为croe,
# 可以使用kubectl api‐versions
# 获取当前k8s版本上所有的apiVersion版本信息(每个版本可能不同)
apiVersion: apps/v1
# 资源类别
kind: Deployment
# 资源元数据
metadata:
  creationTimestamp: null
  labels:
    app: my-tomcat-1
  name: my-tomcat-1  # deployment名称
# 期望状态
spec:
  replicas: 1  #pod副本数
  selector:
    matchLabels:
      app: my-tomcat-1
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: my-tomcat-1
    spec:
      containers:
      - image: tomcat
        name: tomcat
        resources: {}
# 当前状态,用户不能定义,由k8s维护
status: {}
  • 第三步: 创建yaml文件后,我们就可以执行以下命令用yaml文件来创建这次部署:

kubectl apply -f deployment-demo.yaml

还可以用yaml创建service资源的对象

kubectl expose deployment my-tomcat --name=tomcat --port=8080 --type=NodePort --dry-run -o yaml

在这里插入图片描述
创建service-demo.yaml

apiVersion: v1
kind: Service
metadata:
  creationTimestamp: null
  labels:
    app: my-tomcat-1
  name: tomcat      #service名称
spec:
  ports:
  - port: 8080 # service的虚拟ip对应的端口,在集群内网机器可以访问用service的虚拟ip加该端口号访问服务
    protocol: TCP
    targetPort: 8080  # pod暴露的端口,一般与pod内部容器暴露的端口一致
  selector:
    app: my-tomcat-1
  type: NodePort
status:
  loadBalancer: {}

执行命令如下命令就可以用yaml文件来创建service

kubectl apply -f service-demo.yaml

针对已有资源输出资源清单yaml,用yaml创建pod资源的对象

#使用 -o 参数加yaml,可以将资源的配置以yaml的格式输出出来,也可以使用json,输出为json格式
kubectl get pod nginx-f89759699-vtcvl -o yaml

在这里插入图片描述



附录1 Docker安装

  • Docker 要求 CentOS 系统的内核版本高于 3.10
    # 查看内核版本
    uname ‐r
    
  • 安装需要的软件包, yum-utils提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
    # yum-util 提供yum-config-manager功能
    yum install -y yum‐utils
    # 设置yum源,并更新 yum 的包索引
    sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
    yum makecache fast
    # 注意: 官方软件源默认启用了最新的软件,您可以通过编辑软件源的方式获取各个版本的软件包。例如官方并没有将测试版本的软件源置为可用,您可以通过以下方式开启。同理可以开启各种测试版本等。
    # vim /etc/yum.repos.d/docker-ce.repo
    #   将[docker-ce-test]下方的enabled=0修改为enabled=1
    #
    # 安装指定版本的Docker-CE:
    # Step 1: 查找Docker-CE的版本:
    # yum list docker-ce.x86_64 --showduplicates | sort -r
    #   Loading mirror speeds from cached hostfile
    #   Loaded plugins: branch, fastestmirror, langpacks
    #   docker-ce.x86_64            17.03.1.ce-1.el7.centos            docker-ce-stable
    #   docker-ce.x86_64            17.03.1.ce-1.el7.centos            docker-ce-stable
    #   docker-ce.x86_64            17.03.0.ce-1.el7.centos            docker-ce-stable
    #   Available Packages
    # Step2: 安装指定版本的Docker-CE: (VERSION例如上面的17.03.0.ce.1-1.el7.centos)
    # sudo yum -y install docker-ce-[VERSION]
    
  • 查看所有仓库中所有docker版本,并选择特定版本安装
    yum list docker-ce --showduplicates | sort -r
    
  • 安装docker
    yum install docker-ce-19.03.9-3.el7 -y # 这是指定版本安装
    
  • 启动docker并加入开机启动
    systemctl start docker && systemctl enable docker
    
  • 验证安装是否成功(有client和service两部分表示docker安装启动都成功了)
    docker version
    
    在这里插入图片描述
  • docker 镜像加速

附录2 yum k8s问题

  • ‘ascii’ codec can’t decode byte 0xe2 in position 719: ordinal not in range(128)
    • 原因: 网上搜是python2的编码问题
    • 解决方法:
      cat > /usr/lib/python2.7/site-packages/sitecustomize.py << EOF
       #encoding=utf8
       import sys
       reload(sys)
       sys.setdefaultencoding('utf-8')
       EOF
      
      # 重启python编译器
      python
      



附录3 k8s start问题

  • systemctl status kubelet -l 查看k8s启动状态发现启动失败,
    在这里插入图片描述
    • journalctl -xefu kubelet 查看启动日志,发现:

      Jan 30 10:30:20 k8s-node1 kubelet[1797]: F0130 10:30:20.011562 1797 server.go:199] failed to load Kubelet config file /var/lib/kubelet/config.yaml, error failed to read kubelet config file “/var/lib/kubelet/config.yaml”, error: open /var/lib/kubelet/config.yaml: no such file or directory

    • 解决方案:

      # 执行kubeadm init
      kubeadm init --kubernetes-version=v1.18.0 --image-repository=registry.aliyuncs.com/google_containers --pod-network-cidr=172.16.0.0/16 --apiserver-advertise-address=192.168.***.***
      



附录4 k8s master init问题

  • [WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/
    
    • 原因:检测到"cgroupfs"作为Docker的cgroup驱动程序。 推荐使用systemd驱动需要更换驱动,修改docker Driver
    • 解决方案:
      # 修改配置文件
      vim /etc/docker/daemon.json
      # 增加以下配置json
      {
      "exec-opts":["native.cgroupdriver=systemd"]
      }
      # 重启docker
      systemctl restart docker
      



附录5 node节点添加进集群失败,可以删除节点重新添加

要删除 k8s­node1 这个节点,首先在 master 节点上依次执行以下两个命令

kubectl drain k8snode1 --delete-local-data --force --ignore-daemonsets
kubectl delete node k8snode1

执行后通过 kubectl get node 命令可以看到 k8s­node1 已被成功删除 接着在 k8s­node1 这个 Node 节点上执行如下命令,这样该节点即完全从 k8s 集群中脱离开来,之后就可以重新执 行命令添加到集群

kubeadm reset
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张矜持

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值