环境准备

  • 关闭防火墙

    systemctl stop firewalld
    systemctl disable firewalld
    
  • 关闭selinux

    sed -i 's/enforcing/disabled/g' /etc/selinux/config #永久
    setenforce 0 #临时
    
  • 关闭swap分区(K8s禁止虚拟内存以提高性能)

    sed -ri 's/.*swap.*/#&/' /etc/fstab #永久
    swapoff -a #临时
    
  • 在master添加hosts

    cat >> /etc/hosts << EOF
    192.168.172.131 k8smaster
    192.168.172.132 k8snode
    EOF
    
  • 设置网桥参数

    cat> /etc/sysctl.d/k8s.conf << EOF
    net.bridge.bridge-nf-call-ip6tables =1
    net.bridge.bridge-nf-call-iptables =1
    EOF
    sysctl --system #生效
    
  • 时间同步

    # 添加wlnmp源
    rpm -ivh http://mirrors.wlnmp.com/centos/wlnmp-release-centos.noarch.rpm
    # 安装ntp服务
    # yum install ntpdate -y
    yum install -y wntp
    #  查看和ntp server的时间差异
    ntpdate -d cn.pool.ntp.org
    # 时间同步
    ntpdate cn.pool.ntp.org
    ntpdate time.windows.com
    

安装步骤

所有服务器节点都需要安装 Docker \ kubeadmn \ kubelet \ kubectl

Kubernetes默认容器运行环境是Dockers, 因此需要首先安装Docker

  1. 安装Docker

    • 更新docker 的yum源

      yum install -y wget
      wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
      
    • 安装指定版本的docker

      yum install docker-ce-19.03.13 -y
      
    • 配置加速器加速下载

      cat > /etc/docker/daemon.json << EOF
      {
          "registry-mirrors": [
          	"https://gg3gwnry.mirror.aliyuncs.com",
          	"https://registry.docker-cn.com"
          ]
      }
      EOF
      
      systemctl enable docker.service
      systemctl start docker
      
  2. 安装kubeadm \ kubelet \ kubectl

    • 添加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

      yum install -y kubelet-1.19.4 kubeadm-1.19.4 kubectl-1.19.4
      systemctl enable kubelet.service
      
    • 查看是否安装成功

      yum list installed | grep kubelet
      yum list installed | grep kubeadm
      yum list installed | grep kubectl
      
    • 查看安装的版本

      kubelet --version
      
    • 命令说明

      • Kubelet: 运行在cluster所有节点上,负责启动pod和容器
      • Kubeadm: 用于初始化cluster
      • Kubectl: kubenetes的命令行工具,通过该工具部署和管理应用;查看各种资源;创建、删除和更新组件
  3. 部署Kubernetes Master节点

    • 初始化

      kubeadm init \
          --apiserver-advertise-address=192.168.172.131 \
          --image-repository registry.aliyuncs.com/google_containers \
          --kubernetes-version v1.19.4 \
          --service-cidr-10.96.0.0/12 \
          --pod-network-cidr=10.244.0.0/16
      

      说明

      • apiserver-advertise-address:Mater节点通知地址
      • image-repository: 镜像地址,默认链接谷歌
      • kubernetes-version:k8s版本
      • service-cider:功能未知,内部通信使用
      • pod-network-cidr:功能未知,内部通信使用

      service-cider地址选取不能和pod-network-cidr及本机网络又重叠或冲突,一般可选择一个本机网络和pod-network-cidr都没有用到的私有网段地址

    • 执行规则

      mkdir -p $HOME/.kube
      sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
      sudo chown $(id -u):$(id -g) $HOME/.kube/config
      
  4. 将Node节点加入Master中

    在Node节点执行master初始化时给出的命令

    kubeadm join 192.168.172.131:6443 \
    	--token ***************** \
    	--discovery-token-ca-cert-hash sha246:*************************
    
  5. 建立Master - Node通信

    • 下载kube-flannel.yml文件

      wget https://raw.githubusercontentent.com/coreos/flannel/master/Documentation/kube-flannel.yml
      
      yum install -y lrzsz # 可选:安装远程上传下载工具
      
    • 应用kube-flannel.yml文件到运行时容器

      kubectl apply -f kube-flannel.yml
      
    • 查看运行时容器pod

      kubectl get pods -n kube-system
      
      • 查看节点状态
      kubectl get nodes
      

Kubernetes部署'容器化应用'

  1. 在集群中部署一个Nginx

    kubectl create deployment nginx --image=nginx:latest
    kubectl expose deployment nginx --port=80 --type=NodePort
    kubectl get pod,svc
    

    访问地址: http://NodeIP:Port

  2. 在集群中部署一个Tomcat

    kubectl create deployment tomcat --image=tomcat:latest
    kubectl expose deployment tomcat --port=8080 --type=NodePort
    

    访问地址: http://NodeIP:Port

  3. 在集群中部署SpringBoot应用

    • 项目打包(jar, war)==> 工具:git、maven、jenkins

    • 制作Dockerfile文件,生成镜像

    • kubectl create deployment <容器名> --image=<镜像名称>

    • 应用部署成功,以docker容器的方式在pod运行

    • 自定义JDK镜像

      FROM centos:latest
      MAINTAINER SPARON
      ADD jdk-8u251-linux-x64.tar.gz /usr/local/java
      ENV JAVA_HOME /usr/local/java/jdk1.8.0.251
      ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
      ENV PATH $PATH:$JAVA_HOME/bin
      CMD java -version
      
    • 构建镜像

      docker build -t <镜像名> .
      
    • 通过镜像创建容器并运行

      docker run -d [--name <容器名> ...] <镜像名|镜像ID>
      
    • 空运行测试

      kubectl create deployment <容器名> --image=<镜像名> [--dry-run -o yaml > deploy.yaml]
      
    • Yml 文件方式部署

      kubectl apply -f deploy.yaml
      kubectl get pods
      

      deploy.yaml

      apiVersion: apps/v1
      kind: Deployment
      metadata:
      	creationTimestamp: null
      	labels:
      		app: <容器名>
          name: <容器名>
      spec:
      	replicas: 1
      	selector:
      		matchLabels:
      			app: <容器名>
      	strategy: {}
      	template:
      		metadata:
      			creationTimestamp: null
      			labels:
      				app: <容器名>
      		spec:
      			containers:
      			- image: <镜像名>
      			  name: <镜像名>
      			  imagePullPolicy: Never # 不从远程拉取
      			  resources: {}
      status: {}
      
    • 暴露服务端口

      kubectl expose deployment <容器名> --port=<端口号> --type=NodePort
      
  • 部署的一些常用命令

    kubectl get node[s]
    kubectl get service[s]
    kubectl get deploy[ment]
    kubectl get pod[s]
    
    kubectl delete service[s] <name>
    kubectl delete deploy[ment] <name>
    kubectl delete pod[s] <name>
    
    kubectl describe pod[s]  <name> # 查看pod详细信息
    

部署Kubernetes Dashboard

项目地址:https://github.com/kubernetes/dashboard

  1. 安装

    wget https://raw/githubusercontent.com/kubernetes/dashboard/v2.0.4/aio/deploy/recommended.yaml
    kubectl apply -f recommended.yaml
    // kubectl apply -f https://raw/githubusercontent.com/kubernetes/dashboard/v2.0.4/aio/deploy/recommended.yaml
    
  2. 修改yaml文件

  3. 获取token,Dashboard需要用到

    kubectl create serviceaccount dashboard-admin -n kube-system
    kubectl create clusterrolebinding dashboard-admin \
    	--clusterrole=cluster-admin \
    	--serviceaccount=kube-system:dashboard-admin
    # 以上命令只需要执行一次
    
    # 以下命令获取token
    kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
    

部署Ingress

  • 官网: https://kubernetes.github.io/ingress-nginx

  • 安装

    kubectl apply -f kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.46.0/deploy/static/provider/baremetal/deploy.yaml
    
  • 修改yaml配置文件333行为阿里云镜像源

  • 修改322行,hostNetwork: true, 支持域名跳转

  • 应用

    kubectl apply -f deploy.yaml
    
  • 查看应用状态

    kubectl get pods -n ingress-nginx
    
  • 配置Ingress规则

    apiVersion:networking.k8s.io/vi
    kind: Ingress
    metadata:
    	name: k8s-ingress # 规则名,不能重复
    spec:
    	rules:
    	- host: www.cloud.com
    	  http:
    	  	paths:
    	  	- pathType: Prefix
    	  	  path: /
    	  	  backend:
    	  	  	service:
    	  	  		name: nginx # service name
    	  	  		port:
    	  	  			number: 80
    
    kubectl delete -A ValidatingWebhookConfiguragtion ingress-nginx-admin
    kubectl get ing[ress] # 查询规则