环境初始化

  1. 检测操作系统版本,该安装方式要求centos版本在7.5以上

    1. cat /etc/redhat-release
  2. 修改主机名(所有节点设置对应主机名)

    hostnamectl set-hostname [hostname]
    
  3. 主机名解析,方便集群之间节点调用,企业推荐使用内部dns

    vim /etc/hosts
    192.168.3.180    k8s-master
    192.168.3.181 k8s-node1
    192.168.3.183    k8s-node2
    
  4. 时间同步,kubenetes要求集群中的时间节点必须保持一致,这里采用chronyd服务从网路同步时间,企业中建议配置内部时间同步服务器 ```shell

    安装chronyd服务

    yum -y install chrony

    启动chronyd服务

    systemctl start chronyd

    设置chronyd服务开机自启

    systemctl enable chronyd

    使用date查看当前时间

    date


上下两种同步方式任选一种,如果需要安装ceph建议用chronyd


yum install ntpdate -y ntpdate time.windows.com


5.  禁用iptables和firewalld服务,kubenetes和docker在运行中会产生大量的iptables规则,为了不让系统规则跟他们混淆,直接关闭系统规则
```shell
#1.关闭firewalld服务
systemctl stop firewalld && systemctl disable firewalld
#2.关闭iptables服务
#下载iptables
yum install iptables-services -y

systemctl stop iptables && systemctl disable iptables
  1. 禁用selinux,selinux是linux的安全服务,不关闭容易产生各种问题 ```shell

    编辑 /etc/selinux/config 文件,修改SELINUX的值为disabled,修改完重启linux。该处不用重启,可以在初始化环境结束后在重启

    vim /etc/selinux/config SELINUX=disabled

也可以直接使用命令


sed -i ‘s/enforcing/disabled/‘ /etc/selinux/config


7.  禁用swap分区,swap分区是指虚拟内存,当物理内存使用完后,将磁盘空间虚拟成内存来使用,swap会对系统的性能产生负面影响,因此kubenetes所有节点都需要禁用swap,如果因为其他原因不能关闭,需要在集群安装过程中明确的通过参数进行配置说明(百度)。
```shell
#编辑分区文件/etc/fstab 注释掉swap分区一行
#/dev/mapper/centos-swap swap defaults 0 0 

---------------------------
#也可以直接使用命令
---------------------------
sed -ri 's/.*swap.*/#&/' /etc/fstab
  1. 修改linux内核参数,添加网桥过滤和地址转发功能,

    #编辑 /etc/sysctl.d/kubernetes.conf文件,添加以下配置
    net.bridge.bridge-nf-call-ip6tables =  1
    net.bridge.bridge-nf-call-iptables = 1
    net.ipv4.ip_forward = 1
    vm.swappiness = 0
    
    #重新加载配置
    sysctl -p
    #加载网桥过滤模块
    modprobe br_netfilter
    #查看网桥过滤模块是否开启成功
    lsmod  |grep br_netfilter
    

    配置ipvs功能,在kubernetes中service有两种代理模型,一种是基于iptables的,一种是基于ipvs的,两者比较的话,ipvs性能明显要高一些,但是如果要使用它,需要手动载入模块

    #1.安装ipset和ipvsadm
    yum install ipset ipvsadm -y
    #2.添加需要加载的模块写入脚本
    cat > /etc/sysconfig/modules/ipvs.modules <<EOF
    #!/bin/bash
    modprobe -- ip_vs
    modprobe -- ip_vs_rr
    modprobe -- ip_vs_wrr
    modprobe -- ip_vs_sh
    modprobe -- nf_conntrack_ipv4
    EOF
    #3.为脚本添加执行权限
    chmod +x /etc/sysconfig/modules/ipvs.modules
    #4 执行脚本文件
    /bin/bash /etc/sysconfig/modules/ipvs.modules
    #5 查看对应模块是否加载成功
    lsmod | grep -e ip_vs -e nf_conntrack_ipv4
    
  2. 重启三台服务器

    reboot
    

    安装docker

  3. 安装yum-utils

    yum install -y yum-utils
    
  4. 配置docker国内镜像源和yum国内镜像源 ```shell wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo yum clean all


3.  安装docker
```shell
yum -y install docker-ce-18.06.3.ce-3.el7
  1. 添加配置文件,docker在默认清空下使用的cgroup driver为cgroups,而kubernetes推荐使用systemd来代替cgroups

    mkdir /etc/docker
    cat <<EOF> /etc/docker/daemon.json
    {
    "exec-opts":["native.cgroupdriver=systemd"],
    "registry-mirrors": ["https://w5hfxsgn.mirror.aliyuncs.com"]
    }
    EOF
    
  2. 设置启动和开机自启

    systemctl daemon-reload
    systemctl start docker 
    systemctl enable docker
    #查看docker版本信息
    docker version
    

    安装kubernetes组件

  3. 由于kubernetes的镜像源在国外,速度比较慢,这里切换成国内镜像源

    #编辑/etc/yum.repos.d/kubernetes.repo,添加以下配置
    [kubernetes]
    name=Kubernetes
    baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
    enable=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
    
  4. 安装kubeadm、kubelete、kubectl

    yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
    
  5. 配置kubelet的cgroup

    #编辑/etc/sysconfig/kubelet,删除原有数据。添加下面配置
    KUBELET_CGROUP_ARGS="--cgroup-driver=system"
    KUBE_PROXY_MODE="ipvs"
    
  6. 设置kubelet开机自启

    systemctl enable kubelet
    

    准备集群镜像

  7. 通过命令查看需要的镜像

    kubeadm config images list
    
  1. k8s镜像仓库国内无法访问。阿里云有其镜像但是tag不通,我们下载阿里云的镜像,然后更换tag并删除原镜像。

    #定义镜像
    images=(
    kube-apiserver:v1.18.20
    kube-controller-manager:v1.18.20
    kube-scheduler:v1.18.20
    kube-proxy:v1.18.20
    pause:3.2
    etcd:3.4.3-0
    coredns:1.6.7
    )
    #循环下载镜像
    for imageName in ${images[@]} ; do
    docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
    docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName               k8s.grc.io/$imageName
    docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName 
    done
    

    集群初始化(只在master节点上操作)

  2. 初始化集群,apiserver0advertise-address后的ip地址改为masterip地址

    kubeadm init \
    --apiserver-advertise-address=192.168.3.180 \
    --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
    
  3. 出现该图显示样式表示初始化成功,切记,该处别清屏或者重启。

1630590992(1).png

  1. 根据初始化信息提示,还需要以下操作
 mkdir -p $HOME/.kube
 sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
 sudo chown $(id -u):$(id -g) $HOME/.kube/config
  1. 然后在node节点执行以下命令,该命令也来自初始化成功后信息
    kubeadm join 192.168.3.180:6443 --token lpkvp0.vywiwmfk80xpgwvi \
    --discovery-token-ca-cert-hash sha256:b6f4a21d858681e971fe0cfa25365cd35d874d5f87369cc57a3f14156cad3bac
    
  1. 默认的token有效期为24小时,当过期之后,该token就不能用了,这时可以使用如下的命令创建token:

    kubeadm token create --print-join-command
    
  2. 生成永不过期token

    kubeadm token create --ttl 0 --print-join-command
    
  3. 执行下列命令可以看到节点信息

    kubectl get nodes
    

    安装网络插件,k8s支持多种网络插件,比如flannel、calico、canal,任选一种,本次选择flannel,建议选择calico,

  4. 该操作同样只在master节点操作,下载kube-flannel.yml文件或者calico.yaml。

kube-flannel.ymlcalico.yaml

  1. 将文件上传至master节点下,在yml所在文件夹执行下列指令。 ```bash kubectl apply -f kube-flannel.yml

根据插件选择执行yaml即可


kubectl apply -f calico.yaml


3. 以下为错误信息处理
   1. 将操作节点上的/etc/kubernetes/admin.conf文件分发到所有节点的/etc/kubernetes目录下。编辑环境变量文件。执行操作。
```shell
#编辑环境变量文件
vim  ~/.bash_profile
#在末尾添加如下信息
export KUBECONFIG=/etc/kubernetes/admin.conf
#保存后,让配置生效
source ~/.bash_profile
  1. kubectl get nodes 使用该命令会发现所有节点包括主节点依旧是notready。这时候就是网络插件出现问题。
  2. 使用命令查看pod状态

    #查看kube-system命名空间下所有pod
    kubectl get pod -n kube-system
    #找到status为Init:ImagePullBackOff
    #使用命令再看其运行状态
    kubectl describe pod -n kube-system kube-flannel-ds-gl766
    #可以看到flannel镜像没有拉取下来,国内没有该镜像,但是找到了替换镜像,注意tag,如果tag不对可以使用docker search搜索可替换镜像,看描述。下面的插件安装工作在所有节点操作。所有节点均需要操作!
    docker pull xwjh/flannel:v0.14.0
    #使用tag替换镜像
    docker tag xwjh/flannel:v0.14.0 quay-mirror.qiniu.com/coreos/flannel:v0.14.0
    #删除原有镜像
    docker rmi xwjh/flannel:v0.14.0
    

    1631117399(1).png
    1631117503(1).png

  3. 等一会就会全部ready了

    网络部署测试

  1. 部署nginx。

    kubectl create deployment nginx --image=nginx:1.14-alpine
    
  2. 暴露80端口

    kubectl expose deployment nginx --port=80 --type=NodePort
    
  3. 查看服务状态

    kubectl get pods,svc
    

    image.png

  4. 访问nginx服务,任一节点ip:端口,例如上放图片描述,192.168.3.180:30989

image.png

  1. kubectl cluster-info 可以获取kubectl信息

获取kebenetes dashboard 令牌
#创建一个用户
kubectl create serviceaccount dashboard-admin -n kube-system
绑定用户为集群管理用户
kubectl create clusterrolebinding dashboard-cluster-admin —clusterrole=cluster-admin —serviceaccount=kube-system:dashboard-admin
#获取令牌名
kubectl getsecret -n kube-system |grep admin
#获取token
kubectl describe secret -n kube-system <上一步获取的令牌名>

kubernetes中kubectl命令自动补全

yum install -y bash-completion
source /usr/share/bash-completion/bash_completion
source <(kubectl completion bash)
echo “source <(kubectl completion bash)” >> ~/.bashrc
 vim /root/.bashrc
source /usr/share/bash-completion/bash_completion
source <(kubectl completion bash)