Kubernetes集群(三)

一、生产环境下的k8s集群搭建

官方网址:https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

 

 

 

 上图是官网的对环境要求,之前我在docker的文章中有写过用Vagrantfile文件创建虚拟机,接下来,我还是用这种方式创建一主两从的虚拟机环境出来

1.1、Vagrantfile文件

boxes = [
    {
        :name => "master-kubeadm-k8s",
        :eth1 => "192.168.0.105",
        :mem => "2048",
        :cpu => "2"
    },
    {
        :name => "worker01-kubeadm-k8s",
        :eth1 => "192.168.0.106",
        :mem => "2048",
        :cpu => "2"
    },
    {
        :name => "worker02-kubeadm-k8s",
        :eth1 => "192.168.0.107",
        :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.2、创建虚拟机

然后在文件夹目录执行如下命令就可以看到三台虚拟机的构造过程,最后可以得到一主两从的k8s集群(如果不很理解这过程的去看下我写的docker文章)

 

 

 

 1.3、更新并安装依赖

 3台机器都需要执行

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

1.4、安装docker

在每一台机器上都安装好Docker,版本为18.09.0

01 安装必要的依赖

sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2

02 设置docker仓库

sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

【设置要设置一下阿里云镜像加速器】

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
   "registry-mirrors": ["这边替换成自己的实际地址"]
}
EOF
sudo systemctl daemon-reload

03 安装docker

yum install -y docker-ce-18.09.0 docker-ce-cli-18.09.0 containerd.io

04 启动docker

sudo systemctl start docker && sudo systemctl enable docker

1.5 修改hosts文件

(1)master

设置master的hostname,并且修改hosts文件

sudo hostnamectl set-hostname m
vi /etc/hosts
192.168.0.105 m
192.168.0.106 w1
192.168.0.107 w2

(2)两个worker

设置worker01/02的hostname,分别设置w1和w2,并且修改hosts文件

sudo hostnamectl set-hostname w1
sudo hostnamectl set-hostname w2
vi /etc/hosts
192.168.0.105 m
192.168.0.106 w1
192.168.0.107 w2

(3)使用ping测试一下,我是能ping通的

 

 

 1.6 系统基础前提配置(三台者执行)

(1)关闭防火墙

systemctl stop firewalld && systemctl disable firewalld

(2)关闭selinux

setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

(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

1.7 Installing kubeadm, kubelet and 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

(2)安装kubeadm&kubelet&kubectl

yum install -y kubeadm-1.14.0-0 kubelet-1.14.0-0 kubectl-1.14.0-0

(3)docker和k8s设置同一个cgroup

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

重启kubelet

systemctl enable kubelet && systemctl start kubelet

1.8 proxy/pause/scheduler等国内镜像(三台操作)

(1)查看kubeadm使用的镜像

kubeadm config images list

可以发现这里都是国外的镜像

 

 

 (2)解决国外镜像不能访问的问题

创建kubeadm.sh脚本,用于拉取镜像/打tag/删除原有镜像

vi kubeadm.sh

然后把下面贴进去

#!/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

 

 

1.9 kube init初始化master(主节点上操作)

(1)kube init流程

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

上面说完了操作init的流程,那接下来就是从主节点开始操作这些流程的命令了;

(2)初始化master节点

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

 

 

 在主节点执行下面命令

# 本地有镜像
kubeadm init --kubernetes-version=1.14.0 --apiserver-advertise-address=192.168.0.105 --pod-network-cidr=192.168.0.0/16
【若要重新初始化集群状态:kubeadm reset,然后再进行上述操作】

显示下面上半句话就说明主节点搞定了,下半是要接着执行的命令,最后一个红框是kubeadm join的信息,一定要保存好

 

 

 我的kubeadm join的信息

kubeadm join 192.168.0.105:6443 --token 5nmd9c.jmybcy25lqemuh3w \
    --discovery-token-ca-cert-hash sha256:a9c6c59d89caad4d0cb9d2cda84460dd244b5bcbb806755b6a72f3f443e72c9d 

(3)根据日志提示

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

(4)查看pod验证一下

kubectl get pods

 发现没有资源发现

用命令

kubectl get pods -n kube-system

等待一会儿,同时可以发现像etc,controller,scheduler等组件都以pod的方式安装成功了

 (5)健康检查

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

 

 1.10 部署calico网络插件(主节点)

 

 上图的DNS解析没有生效原因就是差个网络插件,官网上有很多的推荐,我们选一个;

官网的网络插件:https://kubernetes.io/docs/concepts/cluster-administration/addons/

 

 

calico网络插件:https://projectcalico.docs.tigera.io/about/about-calico

在k8s中安装calico

kubectl apply -f https://docs.projectcalico.org/v3.9/manifests/calico.yaml

确认一下calico是否安装成功

kubectl get pods --all-namespaces -w

1.11 kube join

记得保存初始化master节点的最后打印信息【注意这边大家要自己的,下面我的只是一个参考】

kubeadm join 192.168.0.105:6443 --token 5nmd9c.jmybcy25lqemuh3w \
    --discovery-token-ca-cert-hash sha256:a9c6c59d89caad4d0cb9d2cda84460dd244b5bcbb806755b6a72f3f443e72c9d 

(1)在woker01和worker02上执行上述命令

(2)在master节点上检查集群信息,可以看到是Ready状态

kubectl get nodes
NAME                   STATUS   ROLES    AGE     VERSION
master-kubeadm-k8s     Ready    master   19m     v1.14.0
worker01-kubeadm-k8s   Ready    <none>   3m6s    v1.14.0
worker02-kubeadm-k8s   Ready    <none>   2m41s   v1.14.0

1.12 再次体验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

然后ls会发现yml文件创建成功了。

(2)根据pod_nginx_rs.yml文件创建pod

kubectl apply -f pod_nginx_rs.yaml

(3)查看pod

kubectl get pods  #三个nginx会创建成功
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
posted @ 2022-01-23 13:35  童话述说我的结局  阅读(94)  评论(0编辑  收藏  举报