K8s集群

一、物料准备

如下规则申请创建虚拟机

二、系统初始化(所有节点均操作)

设置系统主机名以及Host文件

hostnamectl set-hostname master
hostnamectl set-hostname node01 
hostnamectl set-hostname node02 

设置防火墙为Iptables并设置空规则

systemctl stop firewalld && systemctl disable firewalld
​
 yum -y install iptables-services && systemctl start iptables && systemctl enable iptables && iptables -F && service iptables save

关闭SELINUX

swap,这个当内存不足时,linux会自动使用swap,将部分内存数据存放到磁盘中,这个这样会使性能下降,为了性能考虑推荐关掉

swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
           setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

调整内核参数

modprobe br_netfilter  &&  modprobe ip_conntrack 
sysctl -p /etc/sysctl.d/kubernetes.conf (kubernetes.conf 内容如下)

安装Docker软件

yum install -y yum-utils device-mapper-persistent-data lvm2  
yum-config-manager \ --add-repo \ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 
​
yum update -y && yum install -y docker-ce   
​
# 创建/etc/docker目录
mkdir /etc/docker
​
#配置daemon
cat > /etc/docker/daemon.json << EOF
{
    "exec-opts":["native.cgroupdriver=systemd"],
    "log-driver":"json-file",
    "log-opts":{
        "max-size":"100m"
    }
}
EOF
​
#创建存放docker的配置文件
mkdir -p /etc/systemd/system/docker.service.d
​
#重启docker服务
systemctl daemon-reload && systemctl restart docker && systemctl enable docker

安装Kubeadm(主从配置)

 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
 yum -y install kubeadm-1.15.1 kubectl-1.15.1 kubelet-1.15.1

kubelet是与容器接口进行交互,而k8s通过kubeadm安装以后都是以Pod方式存在,底层是以容器的方式运行。所以一定要开机自启,不然的话启动不了k8s集群

 systemctl enable kubelet.service

三、初始化主节点(仅在master节点执行)

kubeadm init

kubeadm在初始化k8s集群的时候,会从gce云服务器pull一些所需要的镜像

 kubeadm config images list   #获取配套版本列表

按照上图查询得依次pull对应版本,并重新打tag,后续初始化时需要

   $ docker pull kubeimage/kube-apiserver-amd64:v1.15.12  
   $ docker pull kubeimage/kube-controller-manager-amd64:v1.15.12
   $ docker pull kubeimage/kube-scheduler-amd64:v1.15.12
   $ docker pull kubeimage/kube-proxy-amd64:v1.15.12
   $ docker pull kubeimage/pause-amd64:3.1
   $ docker pull kubeimage/etcd-amd64:3.3.10
   $ docker pull coredns/coredns:1.3.1
    $  docker tag kubeimage/kube-apiserver-amd64:v1.15.12  k8s.gcr.io/kube-apiserver:v1.15.0
    $ docker tag kubeimage/kube-controller-manager-amd64:v1.15.12 k8s.gcr.io/kube-controller-manager:v1.15.0
    $ docker tag kubeimage/kube-scheduler-amd64:v1.15.12  k8s.gcr.io/kube-scheduler:v1.15.0
    $ docker tag kubeimage/kube-proxy-amd64:v1.15.12 k8s.gcr.io/kube-proxy:v1.15.0
    $ docker tag kubeimage/pause-amd64:3.1 k8s.gcr.io/pause:3.1
    $ docker tag kubeimage/etcd-amd64:3.3.10 k8s.gcr.io/etcd:3.3.10
    $ docker tag coredns/coredns:1.3.1 k8s.gcr.io/coredns:1.3.1

初始化前修改初始化模板

vim kubeadm-config.yaml 
添加覆盖: 
networking:
  dnsDomain: cluster.local
  podSubnet: "10.244.0.0/16"
  serviceSubnet: 10.96.0.0/12
scheduler: {}
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
featureGates:
  SupportIPVSProxyMode: true
mode: ipvs
​
然后
kubeadm init --config=kubeadm-config.yaml | tee kubeadm-init.log

kubeadm init 执行成功之后结尾处打印node节点加入主节点命令,需要记录下来。最后在node节点执行命令,即可完成集群操作

 

init踩坑:

初始化出错之后需要使用kubeadm reset 命令重置才可再次执行

  1. 无法拉取到需要得镜像

    解决:看日志显示拉取得镜像版本号,重新执行docker pull && docker tag获取对应镜像

  2. 报错kebelet 运行异常

    定位方法:systemctl status kubelet 查看报错PID

    journalctl _PID=$pid 查看报错原因

     如下报错                          

    解决:是健康检查时连接 control-plane-endpoint 地址超时了,k8s.cnblogs.com 用的是阿里云负载均衡(tcp 转发)。

    发现阿里云负载均衡 tcp 转发的一个问题,如果发请求的服务器与负载均衡的后端服务是同一台服务器,则无法通信。

    在 hosts 中将 k8s.cnblogs.com 解析到 master 节点的本机 IP 地址,不走阿里云负载均衡后,问题就解决了

  3. init完成之后,kubectl 命令执行异常

     原因:kubernetes master没有与本机绑定,集群初始化的时候没有绑定,此时设置在本机的环境变量即可解决问题

    解决:

    echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> /etc/profile
    ource /etc/profile

初始化后配置

在当前家目录下创建.kube文件,这里会保存连接配置 kubectl和kubeapi交互,采取HTTPS协议,所以需要些缓存和认证文件都会保存到.kube文件 然后拷贝管理配置文件到.kube目录下

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

Kubernetes的网络模型假定了所有Pod都在一个可以直接连通的扁平网络空间中,目前已经有多个开源组件支持容器网络模型。如Flannel、Open vSwitch、直接路由和Calico。 此处使用Flannel插件

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
​
mkdir install-k8s
mv kubeadm-init.log kubeadm-config.yaml install-k8s/
cd install-k8s/
mkdir core
mv * core/
mkdir plugin
cd plugin
mkdir flannel
cd flannel/
​
#该命令需要安全上网,无法安全上网得环境,可以直接取用本地文件上传虚机
kubectl create -f kube-flannel.yml
​
#查看组件运行,发现flannel已经在运行
kubectl get pod -n kube-system
#查看节点状态是否running
kubectl get node

四、集群操作

在其余工作节点 执行主节点的安装日志中(即第三章 kubeadm init命令日志结尾打印得命令) 的加入命令即可

kubeadm join 192.168.216.196:6443 --token abcdef.0123456789abcdef     --discovery-token-ca-cert-hash sha256:5268e6667db61861669ea11ee2f39ef42aebd5dd05e5722a5d0525d9c214402c

然后在主节点 kubectl get nodes 即可看见所有节点状态

五、部署数据库

创建mysql

使用RC方式部署mysql,首先创建namespace

kubectl create namesapce xxx

编写mysql-rc.yaml文件

apiVersion: v1
kind: ReplicationController
metadata:
  name: mysql-rc
  labels:
    name: mysql-rc
spec:
  replicas: 1
  selector:
    name: mysql-pod
  template:
    metadata:
      labels:
        name: mysql-pod
    spec:
      containers:
        - name: mysql
          image: mysql:5.7
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 3306
          volumeMounts:
            - mountPath: /var/lib/mysql
              name: mydata
          env:
            - name: MYSQL_ROOT_PASSWORD
              value: "root"
      volumes:
        - name: mydata
          hostPath:
           path: /root/mysql/data
kubectl apply -f mysql-rc.yaml -n hy

编写mysql-service.yaml文件

apiVersion: v1
kind: Service
metadata:
  name: mysql-svc
  labels:
    name: mysql-svc
spec:
  type: NodePort
  ports:
    - port: 3306
      targetPort: 3306
      nodePort: 30306
  selector:
    name: mysql-pod

启动mysql-service pod

 kubectl apply -f mysql-svc1.yaml -n hy

kubectl get pod -n hy $podname

踩坑

pod一直异常,使用describe命令查看日志

kubectl describe pod -n hy  $podname
  1. 0/3 nodes are available: 3 Insufficient cpu, 3 Insufficient memory.

    解决办法:kubectl describe node node01 查看节点cpu内存使用情况,或在rc中指定创建pod的资源请求

  2. NetworkPlugin cni failed to set up pod "mysql-npnvz_hy" network: open /run/flannel/subnet.env: no such file or directory

       解决办法:查看指定路径下是否存在subnet.env文件

/run/flannel/subnet.env的内容:
FLANNEL_NETWORK=10.244.0.0/16
FLANNEL_SUBNET=10.224.0.1/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=true

过程中使用得命令

yum安装 yum install

yum卸载 yum remove

kubeadm 卸载重装 kubeadm reset

Logo

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

更多推荐