1、Kuberbetes 平台环境规划
机器规划:
主机名 | IP地址 |
---|---|
Master01 | 10.0.0.31 |
Node01 | 10.0.0.33 |
Node02 | 10.0.0.34 |
Master节点:etcd、api-server、controlor-manager、scheduler
Node节点:kube-proxy、docker
2、系统初始化
所有节点操作
1.设置系统主机名
hostnamectl set-hostname k8s-master01
2.安装依赖包
yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables \
curl sysstat libseccomp wget net-tools vim git
3.关闭selinux和swap
必须防止k8s运行在虚拟内存中,否则会导致运行缓慢
swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
4.设置防火墙为iptables并设置空规则
systemctl stop firewalld && systemctl disable firewalld && yum -y install iptables-services \
systemctl start iptables && systemctl enable iptables
iptables -F && service iptables save
5.添加主机名与ip对应关系
cat /etc/hosts
10.0.0.31 k8s-master01
10.0.0.32 k8s-master02
10.0.0.33 k8s-node01
10.0.0.34 k8s-node02
6.调整内核参数,对于k8s
cat > kubernetes.conf <
7.升级系统内核为 4.44
CentOS 7.x 系统自带的 3.10.x 内核存在一些 Bugs,导致运行的 Docker、Kubernetes 不稳定
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
//安装完成后检查 /boot/grub2/grub.cfg 中对应内核 menuentry 中是否包含 initrd16 配置,如果没有,再安装 一次!
yum --enablerepo=elrepo-kernel install -y kernel-lt
// 设置开机从新内核启动
grub2-set-default 'CentOS Linux (4.4.189-1.el7.elrepo.x86_64) 8 (Core)'
8.kube-proxy开启ipvs的前置条件
ipvs:解决svc(service)和pod之间的调度关系,并且性能/功能都比iptables强大很多,
modprobe br_netfilter
cat > /etc/sysconfig/modules/ipvs.modules <
3、安装 Docker 软件
所有节点安装
1.添加yum源以及安装
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 install -y docker-ce
// 启动docker(启动后会自动生成/etc/docker目录,否则需要手动创建)
systemctl start docker
2.配置daemon.json
cat >/etc/docker/daemon.json </-json.log(需要root权限才能够读),既然日志是存在磁盘上的,那么就要磁盘消耗的问题。下面介绍两个关键参数:
- max-size,单个日志文件最大尺寸,当日志文件超过此尺寸时会滚动,即不再往这个文件里写,而是写到一个新的文件里。默认值是-1,代表无限。
- max-files,最多保留多少个日志文件。默认值是1。
"exec-opts": ["native.cgroupdriver=systemd"]:Docker使用的文件驱动是systemd
3.创建一个存放docker配置文件的目录
mkdir -p /etc/systemd/system/docker.service.d
4.重启docker服务并加入开机启动
systemctl daemon-reload && systemctl restart docker && systemctl enable docker
4、安装Kubeadm
所有节点统一安装kubelet kubeadm kubelectl
1.安装kubelet kubeadm kubelectl
导入阿里云的yum仓库
cat < /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.15.1)
yum -y install kubeadm-1.15.1 kubectl-1.15.1 kubelet-1.15.1
systemctl enable kubelet.service
2.初始化Kubermetes master
kubeadm init \
--apiserver-advertise-address=10.0.0.31 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.15.1 \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.244.0.0/16
由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址。
使用kubectl工具:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
kubectl get nodes
3.安装Pod网络插件(CNI)
只在master节点操作,当node节点加入的时候也会自动安装该插件
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/a70459be0084506e4ec919aa1c114638878db11b/Documentation/kube-flannel.yml
确保能够访问到quay.io这个registery。
4.node加入节点
向集群添加新节点,执行在kubeadm init输出的kubeadm join命令:
kubeadm join 10.0.0.31:6443 --token 711bqn.ozruisxvcz1924fg \
--discovery-token-ca-cert-hash sha256:295acb22b65296410968d040cfbb326642d2e3b177ccbc3626765a0ada6fa9ff
所有节点加入完成
[root@k8s-master01 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master01 Ready master 12m v1.15.1
k8s-node01 Ready 4m39s v1.15.1
k8s-node02 Ready 106s v1.15.1
如果忘了join的命令咋办?可以使用下面的命令获取
[root@k8s-master01 ~]# kubeadm token list
TOKEN TTL EXPIRES USAGES DESCRIPTION EXTRA GROUPS
711bqn.ozruisxvcz1924fg 23h 2019-11-20T00:19:17+08:00 authentication,signing The default bootstrap token generated by 'kubeadm init'. system:bootstrappers:kubeadm:default-node-token
5.kube-proxy开启ipvs
// 修改ConfigMap的kube-system/kube-proxy中的config.conf,把 mode: "" 改为mode: “ipvs" 保存退出即可。
kubectl edit cm kube-proxy -n kube-system
// 删除之前的proxy pod
kubectl get pod -n kube-system |grep kube-proxy |awk '{system("kubectl delete pod "$1" -n kube-system")}'
6.测试Kubernetes集群
在Kubernetes集群中创建一个rc,验证是否正常运行:
创建一个文件nginx_obj.yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: myweb
spec:
replicas: 3
selector:
app: myweb
template:
metadata:
labels:
app: myweb
spec:
containers:
- name: nginx
image: nginx:1.13
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: myweb
spec:
type: NodePort
ports:
- port: 80
nodePort: 30000
targetPort: 80
selector:
app: myweb
指定该文件并创建rc
kubectl create -f nginx_obj.yaml
查看pod和svc信息
[root@k8s-master01 ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
myweb-l4vkm 1/1 Running 0 5s 10.244.1.2 k8s-node01
myweb-qdxgp 1/1 Running 0 5s 10.244.3.2 k8s-node02
[root@k8s-master01 ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.1.0.1 443/TCP 22m
myweb NodePort 10.1.205.42 80:30000/TCP 38s
访问地址:http://NodeIP:30000