Kubernetes搭建一主二从
1、环境准备规划
主机操作系统CentOS7.9
192.168.4.91 master01
192.168.4.92 work01
192.168.4.93 work02
2、设置主机名
[root@localhost ~]# hostnamectl set-hostname master01 [root@localhost ~]# hostnamectl set-hostname work01 [root@localhost ~]# hostnamectl set-hostname work02
3、设置hosts文件,原有的hosts文件不要删除
[root@localhost ~]# vi /etc/hosts 192.168.4.91 master01 192.168.4.92 work01 192.168.4.93 work02
4、设置yum源,安装相关软件包
设置yum源
[root@localhost ~]# cd /etc/yum.repos.d/ [root@localhost ~]# mkdir bak [root@localhost ~]# mv *.repo bak
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
安装软件包
yum install -y conntrack ipvsadm ipset jq sysstat curl iptables libseccomp
5、设置防火墙
关闭防火墙
systemctl stop firewalld && systemctl disable firewalld
重置iptables
iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat && iptables -P FORWARD ACCEPT
关闭swap
swapoff -a sed -i '/swap/s/^\(.*\)$/#\1/g' /etc/fstab
关闭selinux
setenforce 0 systemctl disable firewalld vi /etc/selinux/config SELINUX=disabled
关闭dnsmasq
service dnsmasq stop systemctl disable dnsmasq
6、设置系统参数
cat > /etc/sysctl.d/kubernetes.conf << EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 vm.swappiness = 0 vm.overcommit_memory=1 vm.panic_on_oom=0 fs.inotify.max_user_watches=89100 EOF
文件生效
sysctl -p /etc/sysctl.d/kubernetes.conf
7、设置时间同步
yum install ntpdate -y
ntpdate time.windows.com
8、加载 br_netfilter模块
[root@localhost yum.repos.d]# modprobe br_netfilter [root@localhost yum.repos.d]# lsmod | grep br_netfilter br_netfilter 22256 0 bridge 151336 1 br_netfilter
9、安装docker
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum install docker-ce
开机启动
systemctl enable docker && systemctl start docker
10、设置镜像加速器
配置镜像加速器 cat > /etc/docker/daemon.json << EOF { "registry-mirrors": ["https://j75wwuc0.mirror.aliyuncs.com"], "exec-opts": ["native.cgroupdriver=systemd"] } EOF
11、安装kubeadm,kubectl、kubelet(所有节点)
配置yum
cat > /etc/yum.repos.d/kubernetes.repo << EOF [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=0 repo_gpgcheck=0 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF
安装软件包,高版本的不支持docker
yum install -y kubelet-1.19.0 kubeadm-1.19.0 kubectl-1.19.0
开机启动
systemctl enable kubelet && systemctl start kubelet
12、初始化master节点,只是在master节点执行
kubeadm init --apiserver-advertise-address=192.168.4.91 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.19.0 --service-cidr=10.1.0.0/16 --pod-network-cidr=10.244.0.0/16 --ignore-preflight-errors=all
初始化完成后出现一下提示信息
Your Kubernetes control-plane has initialized successfully! 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/config 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.4.91:6443 --token ghf97f.zl8vayhlgjaq5wqr \ --discovery-token-ca-cert-hash sha256:5344809968b7a3383a13fdd299c6267b46c57fc7bac53dd118f6361c711b835b
按照提醒,执行命令,master节点
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 node NAME STATUS ROLES AGE VERSION master01 NotReady master 10m v1.19.0
13、加入node节点,在两个node节点执行
kubeadm join 192.168.4.91:6443 --token ghf97f.zl8vayhlgjaq5wqr \ --discovery-token-ca-cert-hash sha256:5344809968b7a3383a13fdd299c6267b46c57fc7bac53dd118f6361c711b835b
在主节点执行查看
[root@master01 ~]# kubectl get node NAME STATUS ROLES AGE VERSION master01 NotReady master 12m v1.19.0 work01 NotReady <none> 65s v1.19.0 work02 NotReady <none> 44s v1.19.0
生成的token只有24小时,过期以后得重新生成
kubeadm token create
kubeadm token list
14、部署容器网络
下载文件,下载对应版本的yaml文件,否则会报错
[root@master01 ~]#curl https://docs.projectcalico.org/v3.20/manifests/calico.yaml -O
修改文件
vi calico.yaml
修改这个地方,地址为初始化的时候,--pod-network-cidr=10.244.0.0/16
修改后
此处注意上下文要对齐不能有空格,否则报错!!!!!!!!!!!
执行命令安装
[root@master01 ~]# kubectl apply -f calico.yaml
安装成功
customresourcedefinition.apiextensions.k8s.io/ipamhandles.crd.projectcalico.org configured customresourcedefinition.apiextensions.k8s.io/ippools.crd.projectcalico.org configured customresourcedefinition.apiextensions.k8s.io/kubecontrollersconfigurations.crd.projectcalico.org configured customresourcedefinition.apiextensions.k8s.io/networkpolicies.crd.projectcalico.org configured customresourcedefinition.apiextensions.k8s.io/networksets.crd.projectcalico.org configured clusterrole.rbac.authorization.k8s.io/calico-kube-controllers unchanged clusterrolebinding.rbac.authorization.k8s.io/calico-kube-controllers unchanged clusterrole.rbac.authorization.k8s.io/calico-node unchanged clusterrolebinding.rbac.authorization.k8s.io/calico-node unchanged daemonset.apps/calico-node created serviceaccount/calico-node unchanged deployment.apps/calico-kube-controllers created serviceaccount/calico-kube-controllers unchanged poddisruptionbudget.policy/calico-kube-controllers created
查看状态
[root@master01 ~]# kubectl get pods -n kube-system NAME READY STATUS RESTARTS AGE calico-kube-controllers-577f77cb5c-c82gr 1/1 Running 0 5m21s calico-node-5k47s 1/1 Running 0 5m21s calico-node-n9kvg 1/1 Running 0 5m21s calico-node-rbpkm 1/1 Running 0 5m21s coredns-6d56c8448f-dnmhj 1/1 Running 0 147m coredns-6d56c8448f-l49sd 1/1 Running 0 147m etcd-master01 1/1 Running 0 147m kube-apiserver-master01 1/1 Running 0 147m kube-controller-manager-master01 1/1 Running 0 147m kube-proxy-mlwjh 1/1 Running 0 136m kube-proxy-pzglf 1/1 Running 0 147m kube-proxy-xfb2l 1/1 Running 0 136m kube-scheduler-master01 1/1 Running 0 147m
查看节点状态
[root@master01 ~]# kubectl get node NAME STATUS ROLES AGE VERSION master01 Ready master 149m v1.19.0 work01 Ready <none> 137m v1.19.0 work02 Ready <none> 137m v1.19.0
15、安装Dashboard
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.3/aio/deploy/recommended.yaml
修改配置文件
vi recommended.yaml
修改这个地方
spec: ports: - port: 443 targetPort: 8443 selector: k8s-app: kubernetes-dashboard
加一行,type: NodePort
spec: ports: - port: 443 targetPort: 8443 selector: k8s-app: kubernetes-dashboard type: NodePort
执行(master节点)
[root@master01 ~]# kubectl apply -f recommended.yaml namespace/kubernetes-dashboard created serviceaccount/kubernetes-dashboard created service/kubernetes-dashboard created secret/kubernetes-dashboard-certs created secret/kubernetes-dashboard-csrf created secret/kubernetes-dashboard-key-holder created configmap/kubernetes-dashboard-settings created role.rbac.authorization.k8s.io/kubernetes-dashboard created clusterrole.rbac.authorization.k8s.io/kubernetes-dashboard created rolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created clusterrolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created deployment.apps/kubernetes-dashboard created service/dashboard-metrics-scraper created deployment.apps/dashboard-metrics-scraper created
查看容器是否启动
[root@master01 ~]# kubectl get pods -n kubernetes-dashboard NAME READY STATUS RESTARTS AGE dashboard-metrics-scraper-7b59f7d4df-6jfhh 1/1 Running 0 87s kubernetes-dashboard-5dbf55bd9d-5bqxs 1/1 Running 0 88s
查看端口
[root@master01 ~]# kubectl get pods,svc -n kubernetes-dashboard NAME READY STATUS RESTARTS AGE pod/dashboard-metrics-scraper-7b59f7d4df-6jfhh 1/1 Running 0 5h11m pod/kubernetes-dashboard-5dbf55bd9d-5bqxs 1/1 Running 0 5h11m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/dashboard-metrics-scraper ClusterIP 10.1.254.52 <none> 8000/TCP 5h11m service/kubernetes-dashboard NodePort 10.1.133.155 <none> 443:30587/TCP 5h11m
浏览器登陆,用火狐浏览器
创建用户
kubectl create serviceaccount dashboard-admin -n kube-system
授权
[root@master01 ~]# kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
执行结果:
clusterrolebinding.rbac.authorization.k8s.io/dashboard-admin created
获取token
[root@master01 ~]# kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}') Name: dashboard-admin-token-v2dfj Namespace: kube-system Labels: <none> Annotations: kubernetes.io/service-account.name: dashboard-admin kubernetes.io/service-account.uid: e9f37bba-48b2-424c-8877-d02425596fb0 Type: kubernetes.io/service-account-token Data ==== ca.crt: 1066 bytes namespace: 11 bytes token: eyJhbGciOiJSUzI1NiIsImtpZCI6Ik8wemtVcU5MYXhKc2pDSENfMkx4NEl1dm9sc0psMHpMLVltX1VaelpCNVUifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4tdjJkZmoiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiZTlmMzdiYmEtNDhiMi00MjRjLTg4NzctZDAyNDI1NTk2ZmIwIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmRhc2hib2FyZC1hZG1pbiJ9.E71Cb3PGywcvF1xCF280TGz3bYrg8aAv7IF8dHAFbw7XOOGSGD9XAs5jKc419wg_f2awkLV2BuNpFvuFlN3ioD3EyZNycnzlpARlV8urbl52unoEbtdLhhHJ9Xi1cf7_vTjELnHrR-W8OXNJJo0eYlNyi8gribFQ3GM86erJ-UDlurCcWSlMpCi0Vrp9v68dGighHDzdsE9MkMe424AfLTjLJz_I4f3iu3SL5bJ0iiw9DKQQUXYgVhYcW-bEeE6nLY2O4mHHSmmT6D-nrXcZElI_CwQAg_Up9NoVEoNhsvvmXoMx9zUBDpYKxJnwoz54qP7pSnNxy1TtcMARXuIsXw
复制token到浏览器,点击登陆
登陆后如下:
16、创建一个pod
使用Deployment控制器部署镜像:
[root@master01 ~]# kubectl create deployment web --image=nginx --replicas=3 deployment.apps/web created
查看创建的pod
[root@master01 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
web-96d5df5c8-lfbgg 1/1 Running 0 2m38s
web-96d5df5c8-nf9tz 1/1 Running 0 2m38s
web-96d5df5c8-tnzt4 1/1 Running 0 2m38s
使用Service将Pod暴露出去
[root@master01 ~]# kubectl expose deployment web --port=80 --target-port=80 --type=NodePort service/web exposed
查看Service
[root@master01 ~]# kubectl get service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.1.0.1 <none> 443/TCP 21h web NodePort 10.1.152.103 <none> 80:32009/TCP 106s
访问测试
17、Yaml文件创建pod
kubectl create 创建新的pod
kubectl apply 创建新的、更新
编写一个yaml文件,创建pod
apiVersion: apps/v1 kind: Deployment metadata: name: web2 spec: replicas: 3 selector: matchLabels: app: nginx2 template: metadata: labels: app: nginx2 spec: containers: - name: nginx image: nginx
apiVersion : API版本,可以通过kubectl api-resource | grep deployment
[root@master01 ~]# kubectl api-resources | grep deployment deployments deploy apps true Deployment
kind : 资源类型
使用yaml创建镜像:
[root@master01 ~]# kubectl apply -f deployment.yaml
deployment.apps/web2 created
查看刚才创建的pod
[root@master01 ~]# kubectl get pod NAME READY STATUS RESTARTS AGE web-96d5df5c8-lfbgg 1/1 Running 2 45h web-96d5df5c8-nf9tz 1/1 Running 2 45h web-96d5df5c8-tnzt4 1/1 Running 2 45h web2-5fc4444698-8h68t 1/1 Running 0 113s web2-5fc4444698-f99kz 1/1 Running 0 113s web2-5fc4444698-jlsp2 1/1 Running 0 113s
18、yaml文件创建service
apiVersion: v1 kind: Service metadata: name: web2 spec: selector: app: nginx2 ports: - protocol: TCP port: 80 targetPort: 80 type: NodePort
selector: nginx2 这个地方是关联的pod的selector
创建service
[root@master01 ~]# kubectl apply -f service.yaml
service/web2 created
查看服务:
[root@master01 ~]# kubectl get service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.1.0.1 <none> 443/TCP 6d20h web NodePort 10.1.156.192 <none> 80:31614/TCP 5d21h web2 NodePort 10.1.136.188 <none> 80:30321/TCP 3d18h
查看service关联的pod
[root@master01 ~]# kubectl get endpoints NAME ENDPOINTS AGE kubernetes 192.168.4.91:6443 6d21h web 10.244.205.205:80,10.244.75.79:80,10.244.75.80:80 5d21h web2 10.244.205.206:80,10.244.205.207:80,10.244.75.78:80 11m
如果要删除service,采用命令
[root@master01 ~]# kubectl delete service web2 service "web2" deleted