K8s集群部署
K8s集群一、物料准备如下规则申请创建虚拟机二、系统初始化(所有节点均操作)设置系统主机名以及Host文件hostnamectl set-hostname masterhostnamectl set-hostname node01hostnamectl set-hostname node02设置防火墙为Iptables并设置空规则systemctl stop firewalld &&
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 命令重置才可再次执行
-
无法拉取到需要得镜像
解决:看日志显示拉取得镜像版本号,重新执行docker pull && docker tag获取对应镜像
-
报错kebelet 运行异常
定位方法:systemctl status kubelet 查看报错PID
journalctl _PID=$pid 查看报错原因
如下报错
解决:是健康检查时连接 control-plane-endpoint 地址超时了,k8s.cnblogs.com 用的是阿里云负载均衡(tcp 转发)。
发现阿里云负载均衡 tcp 转发的一个问题,如果发请求的服务器与负载均衡的后端服务是同一台服务器,则无法通信。
在 hosts 中将 k8s.cnblogs.com 解析到 master 节点的本机 IP 地址,不走阿里云负载均衡后,问题就解决了
-
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
-
0/3 nodes are available: 3 Insufficient cpu, 3 Insufficient memory.
解决办法:kubectl describe node node01 查看节点cpu内存使用情况,或在rc中指定创建pod的资源请求
-
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
更多推荐
所有评论(0)