kubernetes简要
Kubernetes 是用于自动部署, 扩展和管理容器化应用程序的开源系统. 它将组成应用程序的容器组合成逻辑单元, 以便于管理和服务发现
kubernetes 功能简介
服务发现和负载均衡
存储编排
自动部署和回滚
自动完成装箱计算
自我修复
密钥与配置管理
主机规划
role | ipaddress | configure |
k8s-master | 192.168.22.208 | 4 core, 4Gb; 50GBS, CentOS 7.9 |
k8s-worker-01 | 192.168.22.205 | 4 core, 4Gb; 100GBS, CentOS 7.9 |
k8s-worker-02 | 192.168.22.201 | 4 core, 4Gb; 100GBS, CentOS 7.9 |
环境初始化
检查操作系统的版本
主机名解析
时间同步
关闭防火墙和selinux
修改主机名
安装
下载部署k8s集群的安装仓库
[root@k8s-master ~]# git clone https://gitee.com/mirschao/k8sconfig.git
初始化脚本里面就是去关闭防火墙,selinux,swap分区,以及增加相应的解析。
运行脚本之前,把hosts文件改了
[root@k8s-master kubeadm-deploys]# vi initialenv.sh
export MASTER='192.168.22.208'
export WORKER1='192.168.22.205'
export WORKER2='192.168.22.201'
export MASTER_HOSTNAME='k8s-master'
export WORKER1_HOSTNAME='k8s-worker-01'
export WORKER2_HOSTNAME='k8s-worker-02'
初始化每个节点
[root@k8s-master kubeadm-deploys]# bash initialenv.sh 当它运行成功后,看看主机解析,其他的一些工具安装,对不对。如果没报错,就到第二台,第三台执行就好了
[root@k8s-master kubeadm-deploys]# scp initialenv.sh root@k8s-worker-01:/root/ 传到另外两台机器下的root目录下
[root@k8s-master kubeadm-deploys]# scp initialenv.sh root@k8s-worker-02:/root/
传完之后,在另外两台机器执行脚本,执行之前先声明这些变量,再去执行初始化脚本。
安装完毕,解析都没有问题。
安装 kubeadm 程序
[root@k8s-master kubeadm-deploys]# yum list kubeadm.x86_64 --showduplicates | sort -r 看kubeadm能安装的版本有哪些
最新版是1.25,阿里是1.22/1.23。我是安装的1.21.14-0(1.21是一个过渡版,承托了上层也承托着下层,能体验到以前的老功能,也能明白学习方向)
master中执行
[root@k8s-master kubeadm-deploys]# yum -y install kubeadm-1.21.14-0 kubelet-1.21.14-0 kubectl-1.21.14-0 kubeadm是安装k8s集群的工具,kubelet是worker节点控制容器运行的工具,kubectl是运维工程师控制k8s集群的命令行工具,可以通过命令行控制k8s里面的资源。
worker中执行
[root@k8s-worker-01 ~]# yum -y install kubeadm-1.21.14-0 kubelet-1.21.14-0
[root@k8s-worker-02 ~]# yum -y install kubeadm-1.21.14-0 kubelet-1.21.14-0
master及worker节点均要执行
修改kubelet的管理驱动,运行容器都是使用namespace和cgroup去进行资源的限额和命名空间的限定,所以要去改资源限额的驱动。把它改成是systemd去进行管理的。
cat <<-EOF >/etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
EOF
systemctl enable --now kubelet 启动
这种状态是正常的,不用管
生成集群初始化配置文件
[root@k8s-master kubeadm-deploys]# kubeadm config print init-defaults >initial.yaml
[root@k8s-master kubeadm-deploys]# vi initial.yaml 这个配置文件中是清单,在清单中保存好我们运行的k8s的版本,包括服务的ip及哈希值,在哪里下载镜像都放在这里。
镜像的下载地址改为阿里云的
[root@k8s-master kubeadm-deploys]# REGISTRYADDR="registry.cn-hangzhou.aliyuncs.com/google_containers"
[root@k8s-master kubeadm-deploys]# sed -i "s#k8s.gcr.io#${REGISTRYADDR}#" initial.yaml 使用sed去修改k8s.gcr.io(因为是国外的镜像网站,访问不到)
[root@k8s-master kubeadm-deploys]# sed -i "s# node# ${HOSTNAME}#" initial.yaml 给集群起名字,调用了hostname
[root@k8s-master kubeadm-deploys]# IPADDRESS=$(ifconfig | grep ens33 -A 2 | awk 'NR==2{ print $2 }') 截取了本地的ip地址
[root@k8s-master kubeadm-deploys]# sed -i "s/1.2.3.4/${IPADDRESS}/" initial.yaml 把ip地址中的1234改成当前主机的ip地址,
配置下载镜像的位置,节点的名称。
[root@k8s-master kubeadm-deploys]# kubeadm config images pull --config initial.yaml 拉取初始化所需要的镜像文件
[root@k8s-master kubeadm-deploys]# kubeadm init --config initial.yaml --upload-certs 初始化集群
如果集群初始化失败: (每个节点都要执行)
$ kubeadm reset -f; ipvsadm --clear; rm -rf ~/.kube
$ systemctl restart kubelet
粘贴到这里,最后面要用
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/configAlternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.22.208:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:977c8102db324b1f0031e665f0f1893266f4be1c5fb625eea1ef41e294679cbd
[root@k8s-master kubeadm-deploys]# mkdir -p $HOME/.kube
[root@k8s-master kubeadm-deploys]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@k8s-master kubeadm-deploys]# chown $(id -u):$(id -g) $HOME/.kube/config
[root@k8s-master kubeadm-deploys]# vi ~/.bashrc 复制到最后
[root@k8s-master kubeadm-deploys]# source ~/.bashrc 生效
部署calico网络插件
[root@k8s-master kubeadm-deploys]# sed -i 's#etcd_endpoints: "http://<ETCD_IP>:<ETCD_PORT>"#etcd_endpoints: "https://172.16.12.11:2379"#g' calico-etcd.yaml 去改calico的ip地址,它服务的ip地址,因为etcd只运行在当前master中,所以只写master节点就行
获取证书的命令
ETCD_CA=`cat /etc/kubernetes/pki/etcd/ca.crt | base64 | tr -d '\n'`
ETCD_CERT=`cat /etc/kubernetes/pki/etcd/server.crt | base64 | tr -d '\n'`
ETCD_KEY=`cat /etc/kubernetes/pki/etcd/server.key | base64 | tr -d '\n'`
[root@k8s-master kubeadm-deploys]# sed -i "s@# etcd-key: null@etcd-key: ${ETCD_KEY}@g; s@# etcd-cert: null@etcd-cert: ${ETCD_CERT}@g; s@# etcd-ca: null@etcd-ca: ${ETCD_CA}@g" calico-etcd.yaml 将它注入到calico的配置文件中
[root@k8s-master kubeadm-deploys]# sed -i 's#etcd_ca: ""#etcd_ca: "/calico-secrets/etcd-ca"#g; s#etcd_cert: ""#etcd_cert: "/calico-secrets/etcd-cert"#g; s#etcd_key: ""#etcd_key: "/calico-secrets/etcd-key"#g' calico-etcd.yaml 放开路径
如果机器是192.168 就要设置成172.16.0.0/16 (私网起头的网络位是不一样的)
[root@k8s-master kubeadm-deploys]# sed -i 's@# - name: CALICO_IPV4POOL_CIDR@- name: CALICO_IPV4POOL_CIDR@g; s@# value: "172.16.0.0/16"@ value: '"172.16.0.0/16"'@g;' calico-etcd.yaml
[root@k8s-master kubeadm-deploys]# kubectl apply -f calico-etcd.yaml 根据资源清单创建在k8s集群中
calico安装完毕
对于集群后续的配置和设置
集群网络规则采用 ipvs 模式
[root@k8s-master kubeadm-deploys]# kubectl edit configmap kube-proxy -n kube-system
[root@k8s-master kubeadm-deploys]# kubectl get pod -n kube-system
把这三个kube-proxy删掉,删掉它会自动启动出来新的kube-proxy,就是让它使用我们上面设置的ipvs描述,这就是k8s的好处,随便删,删不坏。
[root@k8s-master kubeadm-deploys]# kubectl delete pod kube-proxy-6h7fp -n kube-system
[root@k8s-master kubeadm-deploys]# kubectl delete pod kube-proxy-nnvj4 -n kube-system
[root@k8s-master kubeadm-deploys]# kubectl delete pod kube-proxy-ns4qv -n kube-system
增加节点
再到第三个节点运行,发现又多了一个节点。
这个状态慢慢会变成ready
以后想扩展集群,使用初始化脚本先运行一遍,然后再去运行刚刚kubeadm join 加入集群的指令,就可以组建成多个集群的节点了。
如果忘记token值 复制粘贴就出来了
$ kubeadm token create --print-join-command
$ kubeadm init phase upload-certs --upload-certs
集群搭建完毕。
测试集群是否成功安装
先要保证节点是rode的状态,再去运行测试
cat <<-EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: webserver
spec:
containers:
- name: nginx-contianer
image: nginx:1.21
ports:
- containerPort: 80
EOF
[root@k8s-master kubeadm-deploys]# watch -n 1 kubectl get pods
kubectl get pods -owide 获取ip地址
curl -I http://192.168.22.208
状态码成200就成功了。
【注意】少熬夜,多看书。