国庆期间闲来无事,写了一个简单的小程序,小程序名称叫做 IT藏经楼。目的是分享这些年自己积累的一些学习材料,方面大家查找使用,包括电子书、案例项目、学习视频、面试题和一些PPT模板。里面所有材料都免费分享。目前小程序中只发布了非常小的一部分,后续会陆续上传分享。当前版本的小程序页面也比较简单,还在逐渐的优化中。

官网:https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
GitHub:https://github.com/kubernetes/kubeadm

我们使用kubeadm搭建一个3台机器组成的k8s集群,1台master节点,2台worker节点

虚拟机配置要求
在这里插入图片描述

一、版本要求

为了避免版本不一致导致的问题,我们先统一一下版本。

  • Docker 18.09.0
  • kubeadm-1.14.0-0
  • kubelet-1.14.0-0
  • kubectl-1.14.0-0
    • k8s.gcr.io/kube-apiserver:v1.14.0
    • k8s.gcr.io/kube-controller-manager:v1.14.0
    • k8s.gcr.io/kube-scheduler:v1.14.0
    • k8s.gcr.io/kube-proxy:v1.14.0
    • k8s.gcr.io/pause:3.1
    • k8s.gcr.io/etcd:3.3.10
    • k8s.gcr.io/coredns:1.3.1
  • calico:v3.9

二、 准备虚拟机

我们需要准备3台Centos虚拟机
Windows中搭建使用Vagrant + virtualbox搭建步骤:

  1. 在Windows中创建虚拟机目录
    E:\Kubernetes\VM\k8s-docker-centos7
  2. 在该目录下创建Vagrantfile file,在文件中定义3台虚拟机并指定IP以及内存等信息
boxes = [
    {
        :name => "master-kubeadm-k8s",
        :eth1 => "192.168.0.51",
        :mem => "2048",
        :cpu => "2"
    },
    {
        :name => "worker01-kubeadm-k8s",
        :eth1 => "192.168.0.61",
        :mem => "2048",
        :cpu => "2"
    },
    {
        :name => "worker02-kubeadm-k8s",
        :eth1 => "192.168.0.62",
        :mem => "2048",
        :cpu => "2"
    }
]

Vagrant.configure(2) do |config|

  config.vm.box = "centos/7"
  
   boxes.each do |opts|
      config.vm.define opts[:name] do |config|
        config.vm.hostname = opts[:name]
        config.vm.provider "vmware_fusion" do |v|
          v.vmx["memsize"] = opts[:mem]
          v.vmx["numvcpus"] = opts[:cpu]
        end

        config.vm.provider "virtualbox" do |v|
          v.customize ["modifyvm", :id, "--memory", opts[:mem]]
		  v.customize ["modifyvm", :id, "--cpus", opts[:cpu]]
		  v.customize ["modifyvm", :id, "--name", opts[:name]]
        end

        config.vm.network :public_network, ip: opts[:eth1]
      end
  end

end
  1. 运行vagrant up启动虚拟机
    在这里插入图片描述
    在这里插入图片描述
  2. 通过vagrant ssh master-kubeadm-k8s命令进入虚拟机并作如下修改之后(3台虚拟机都需要),可以使用root账户登陆
sudo -i
vi /etc/ssh/sshd_config
   修改PasswordAuthentication yes
passwd [修改密码]
systemctl restart sshd [重启sshd服务]

在这里插入图片描述
5. 通过root账户登陆3台虚拟机,确保都能够彼此ping通
在这里插入图片描述

三、更新并安装依赖

3台机器都需要执行下面命令

yum -y update
yum install -y conntrack ipvsadm ipset jq sysstat curl iptables libseccomp

四、安装Docker

3台机器都需要执行,安装版本为18.09.0

  1. 卸载之前安装的docker
    sudo yum remove docker docker latest docker-latest-logrotate \
    docker-logrotate docker-engine docker-client docker-client-latest docker-common
    
  2. 安装必要依赖
    sudo yum install -y yum-utils device-mapper-persistent-data lvm2
    
  3. 添加软件源信息
    sudo yum-config-manager \
    --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    yum list | grep docker-ce
    
  4. 更新yum缓存
    sudo yum makecache fast
    
  5. 添加阿里云镜像
    sudo mkdir -p /etc/docker
    sudo tee /etc/docker/daemon.json <<-'EOF'
    {
      "registry-mirrors": ["https://ns2jtf98.mirror.aliyuncs.com"]
    }
    EOF
    
  6. 安装Docker
    sudo yum install -y docker-ce-18.09.0 docker-ce-cli-18.09.0 containerd.io [指定安装docker版本]
    
  7. 启动docker并设置开机启动
    sudo systemctl start docker && sudo systemctl enable docker
    
  8. 测试docker安装是否成功
    sudo docker run hello-world
    

五、修改Host文件

  1. 设置master的hostname,并且修改hosts文件
    sudo hostnamectl set-hostname m
    
  2. 设置worker01/02的hostname,并且修改hosts文件
    sudo hostnamectl set-hostname w1
    sudo hostnamectl set-hostname w2
    
  3. 修改3台机器的host文件
    vi /etc/hosts
    192.168.0.51 m
    192.168.0.61 w1
    192.168.0.62 w2
    
  4. 使用ping测试一下

六、系统基础前提配置

  1. 关闭防火墙
    systemctl stop firewalld && systemctl disable firewalld
    
  2. 关闭selinux
    setenforce 0
    sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
    vi /etc/sysconfig/selinux
    设置selinux = disabled
    
  3. 关闭swap
    swapoff -a
    sed -i '/swap/s/^\(.*\)$/#\1/g' /etc/fstab
    
  4. 配置iptables的ACCEPT规则
    iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat && iptables -P FORWARD ACCEPT
    
  5. 设置系统参数
    cat <<EOF >  /etc/sysctl.d/k8s.conf
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    EOF
    sysctl --system
    

七、安装 kubeadm、kubelet 和 kubectl

  1. 配置yum源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
       http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
  1. 安装kubeadm&kubelet&kubectl
    yum install -y kubeadm-1.14.0-0 kubelet-1.14.0-0 kubectl-1.14.0-0
    
  2. docker和k8s设置同一个cgroup
    # docker
    vi /etc/docker/daemon.json
    "exec-opts": ["native.cgroupdriver=systemd"],
    systemctl restart docker
    
    # # kubelet,这边如果发现输出directory not exist,也说明是没问题的,大家继续往下进行即可
    sed -i "s/cgroup-driver=systemd/cgroup-driver=cgroupfs/g" /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
    
    systemctl enable kubelet && systemctl start kubelet
    

八、proxy/pause/scheduler等国内镜像

  1. 查看kubeadm使用的镜像
    kubeadm config images list
    
    可以发现这里都是国外的镜像
    在这里插入图片描述
  2. 解决国外镜像不能访问的问题
    创建kubeadm.sh脚本,用于拉取镜像/打tag/删除原有镜像
    #!/bin/bash
    
    set -e
    
    KUBE_VERSION=v1.14.0
    KUBE_PAUSE_VERSION=3.1
    ETCD_VERSION=3.3.10
    CORE_DNS_VERSION=1.3.1
    
    GCR_URL=k8s.gcr.io
    ALIYUN_URL=registry.cn-hangzhou.aliyuncs.com/google_containers
    
    images=(kube-proxy:${KUBE_VERSION}
    kube-scheduler:${KUBE_VERSION}
    kube-controller-manager:${KUBE_VERSION}
    kube-apiserver:${KUBE_VERSION}
    pause:${KUBE_PAUSE_VERSION}
    etcd:${ETCD_VERSION}
    coredns:${CORE_DNS_VERSION})
    
    for imageName in ${images[@]} ; do
     docker pull $ALIYUN_URL/$imageName
    docker tag  $ALIYUN_URL/$imageName $GCR_URL/$imageName
      docker rmi $ALIYUN_URL/$imageName
    done
    
    运行脚本:
    sh ./kubeadm.sh
    
    # 查看镜像
    docker images
    
    在这里插入图片描述

九、kube init初始化master

官网: https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/

  1. kube init流程

01-进行一系列检查,以确定这台机器可以部署kubernetes
02-生成kubernetes对外提供服务所需要的各种证书可对应目录
/etc/kubernetes/pki/*
03-为其他组件生成访问kube-ApiServer所需的配置文件
ls /etc/kubernetes/
admin.conf controller-manager.conf kubelet.conf scheduler.conf
04-为 Master组件生成Pod配置文件。
ls /etc/kubernetes/manifests/.yaml
kube-apiserver.yaml
kube-controller-manager.yaml
kube-scheduler.yaml
05-生成etcd的Pod YAML文件。
ls /etc/kubernetes/manifests/
.yaml
kube-apiserver.yaml
kube-controller-manager.yaml
kube-scheduler.yaml
etcd.yaml
06-一旦这些 YAML 文件出现在被 kubelet 监视的/etc/kubernetes/manifests/目录下,kubelet就会自动创建这些yaml文件定义的pod,即master组件的容器。master容器启动后,kubeadm会通过检查localhost:6443/healthz这个master组件的健康状态检查URL,等待master组件完全运行起来
07-为集群生成一个bootstrap token
08-将ca.crt等 Master节点的重要信息,通过ConfigMap的方式保存在etcd中,工后续部署node节点使用
09-最后一步是安装默认插件,kubernetes默认kube-proxy和DNS两个插件是必须安装的

  1. 初始化master节点
    官网:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/
    注意此操作是在主节点上进行
#本地有镜像
kubeadm init --kubernetes-version=1.14.0 --apiserver-advertise-address=192.168.0.51 --pod-network-cidr=10.244.0.0/16
【若要重新初始化集群状态:kubeadm reset,然后再进行上述操作】
#注意:记得保存好最后kubeadm join的信息。

在这里插入图片描述

kubeadm join 192.168.0.51:6443 --token w471f7.crx583w5oy05wz40 \
    --discovery-token-ca-cert-hash sha256:ee8654130e732eaa673ce834cf6b4c4c408a3b7ec1011d1d5952f0d01b1e4fed
  1. 根据日志提示
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

此时kubectl cluster-info查看一下是否成功
4. 查看pod验证一下
等待一会儿,同时可以发现像etc,controller,scheduler等组件都以pod的方式安装成功了
注意:coredns没有启动,需要安装网络插件

kubectl get pods -n kube-system

在这里插入图片描述
5. 健康检查

curl -k https://localhost:6443/healthz

十、部署calico网络插件

选择网络插件:https://kubernetes.io/docs/concepts/cluster-administration/addons/
calico网络插件:https://docs.projectcalico.org/v3.9/getting-started/kubernetes/

calico,同样在master节点上操作

# 在k8s中安装calico
kubectl apply -f https://docs.projectcalico.org/v3.9/manifests/calico.yaml

# 确认一下calico是否安装成功
kubectl get pods --all-namespaces -w

在这里插入图片描述

十一、kube join

执行之前保存初始化master节点的最后打印信息

kubeadm join 192.168.0.51:6443 --token w471f7.crx583w5oy05wz40 \
    --discovery-token-ca-cert-hash sha256:ee8654130e732eaa673ce834cf6b4c4c408a3b7ec1011d1d5952f0d01b1e4fed
  1. 在woker01和worker02上执行上述命令
  2. 在master节点上检查集群信息
    在这里插入图片描述
    到此为止,Kubernetes集群已经搭建完成。

十二、体验Pod

  1. 定义pod.yml文件,比如pod_nginx_rs.yaml
cat > pod_nginx_rs.yaml <<EOF
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: nginx
  labels:
    tier: frontend
spec:
  replicas: 3
  selector:
    matchLabels:
      tier: frontend
  template:
    metadata:
      name: nginx
      labels:
        tier: frontend
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
EOF
  1. 根据pod_nginx_rs.yml文件创建pod
kubectl apply -f pod_nginx_rs.yaml
  1. 查看pod
kubectl get pods
kubectl get pods -o wide
kubectl describe pod nginx

在这里插入图片描述
4. 感受通过rs将pod扩容

kubectl scale rs nginx --replicas=5
kubectl get pods -o wide

在这里插入图片描述
5. 删除pod

kubectl delete -f pod_nginx_rs.yaml
Logo

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

更多推荐