ip addr
ens33为动态分配的IP ,一会将其设为静态地址
编辑配置文件
vim ifcfg-ens33
(1)首先更改BOOTPROTO为static
(2) 其次更改ONBOOT为yes,用于设置是否开机启动
(3)然后增加静态IP、子网掩码、网关IP参数
第一个参数是你需要设置的静态IP地址
第二个参数是子网掩码,和我们截图中的应该相同,也就是它:
第三个参数是网关IP,和我们截图中的应该相同,也就是它:
那么根据上面的解释,我的这三个参数可以设置一下了,例如:
IPADDR=“192.168.220.137”
NETMASK=“255.255.255.0”
GATEWAY=“192.168.220.2”
(4) 配置DSN1,一般都配置成8.8.8.8,如下:
DNS1=“8.8.8.8”
(5) 编辑/etc/sysconfig/network-scripts/resolv.conf
加入 namespace 8.8.8.8
(6) 重启动网络
service network restart
master 192.168.79.133
worker1 192.168.79.134
worker2 192.168.79.135
分别在三台机器上执行下面命令
hostnamectl set-hostname master
hostnamectl set-hostname worker1
hostnamectl set-hostname worker2
Permissive
SELINUX=disabled
执行下面命令将主机名写入三台机器
cat>> /etc/hosts <
[root@master ~]# swapoff -a #禁用所有swap交换分区
[root@master ~]# free -h
total used free shared buff/cache available
Mem: 1.8G 280M 1.2G 9.6M 286M 1.4G
Swap: 0B 0B 0B
[root@master ~]# vim /etc/fstab #永久禁用swap,删除或注释掉/etc/fstab里的swap设备的挂载命令即可
#/dev/mapper/centos-swap swap swap defaults 0 0
将所有机器都进行时间同步,以免各结点时钟不一致导致出错
将桥接的IPv4流量传递到iptables的链(有一些ipv4的流量不能走iptables链,因为linux内核的一个过滤器,每个流量都会经过他,然后再匹配是否可进入当前应用进程去处理,所以会导致流量丢失),配置k8s.conf文件(k8s.conf文件原来不存在,需要自己创建的)
touch /etc/sysctl.d/k8s.conf
cat >> /etc/sysctl.d/k8s.conf <
应用sysctl参数而不重新启动``
sysctl --system
以上6大步骤在每一台虚拟机做完之后,开始安装k8s
在所有节点服务器上都执行,因为k8s默认CRI为docker,cri称之为容器运行时
yum remove docker docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum -y install docker-ce-20.10.9 docker-ce-cli-20.10.9 containerd.io
systemctl enable docker
systemctl start docker
ubernetes1.14之后的版本推荐使用systemd,但docker默认的Cgroup Driver 是Cgroup,使得kubelet部署报错*
{
"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
[root@master ~]# cat >/etc/yum.repos.d/kubernetes.repo <<‘EOF’ #在3台虚拟机都配置k8s的yum源
[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
#在3台虚拟机上都执行安装kubeadm、kubelet、kubectl(kubeadm和kubectl都是工具,kubelet才是系统服务)
[root@master ~]# yum list --showduplicates | grep kubeadm #查看yum可获取的kubeadm版本,这里安装1.22.6版本,不指定版本的话默认安装最新版本
[root@master ~]# yum -y install kubelet-1.22.6 kubeadm-1.22.6 kubectl-1.22.6 #安装kubeadm、kubelet、kubectl
[root@master ~]# systemctl enable kubelet #设置kubelet开机自启(先不用启动,也起不了,后面kubeadm init初始化master时会自动拉起kubelet)
kubeadm init \
--apiserver-advertise-address=192.168.79.133 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.22.6 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
初始化成功后会有相应信息
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 ( i d − u ) : (id -u): (id−u):(id -g) $HOME/.kube/config
Alternatively, 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.79.133:6443 --token 4satw3.taacrwve713g85dy
–discovery-token-ca-cert-hash sha256:933006fe019532c205740ce47d2d7fcadaa323a264811066c8b1374e281fbbf8
[root@master ~]# mkdir -p $HOME/.kube #复制照着做即可
[root@master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config #复制照着做即可
[root@master ~]# sudo chown ( i d − u ) : (id -u): (id−u):(id -g) $HOME/.kube/config #复制照着做即可
[root@master ~]# export KUBECONFIG=/etc/kubernetes/admin.conf #复制照着做即可
kubeadm join 192.168.79.133:6443 --token 4satw3.taacrwve713g85dy
--discovery-token-ca-cert-hash sha256:933006fe019532c205740ce47d2d7fcadaa323a264811066c8b1374e281fbbf8
node节点加入k8s集群后,在master上执行kubectl get nodes发现状态是NotReady,因为还没有部署CNI网络插件,其实在步骤四初始化
完成master节点的时候k8s已经叫我们去配置pod网络了。在k8s系统上Pod网络的实现依赖于第三方插件进行,这类插件有近数十种之多,较为
著名的有flannel、calico、canal和kube-router等,简单易用的实现是为CoreOS提供的flannel项目。
执行下面这条命令在线配置pod网络,因为是国外网站,所以可能报错,测试去http://ip.tool.chinaz.com/网站查到
域名raw.githubusercontent.com对应的IP,把域名解析配置到/etc/hosts文件,然后执行在线配置pod网络,多尝试几次即可成功。
wget https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
找到如下位置,修改Newwork 与执行kubeadm init 一致。
net-conf.json: |
{
“Network”: “10.244.0.0/16”,
“Backend”: {
“Type”: “vxlan”
}
}
可以先拉取镜像然后再执行安装命令
虽然执行安装命令时会自动去拉取镜像,但如果镜像无法拉取,执行安装命令也会失败。镜像拉取到本地后安装时可以直接使用本地镜像。
docker pull rancher/mirrored-flannelcni-flannel-cni-plugin:v1.1.0
docker pull rancher/mirrored-flannelcni-flannel:v0.20.1
新建文件夹 hello_kube,进入该文件夹,新建文件:
创建server.js 文件
var http = require('http');
console.log('Heeeee');
var handleRequest = function(request, response) {
console.log('Received request for URL: ' + request.url);
response.writeHead(200);
response.end('Hello World!');
};
var www = http.createServer(handleRequest);
www.listen(8080);
console.log('Listening')
FROM node:6.14.2
EXPOSE 8080
COPY server.js .
CMD node server.js
apiVersion: v1
kind: Service
metadata:
name: hello-world
spec:
type: NodePort
ports:
- port: 80
targetPort: 8080
nodePort: 31611
selector:
app: hello-world
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-world
spec:
replicas: 3
selector:
matchLabels:
app: hello-world
template:
metadata:
labels:
app: hello-world
spec:
containers:
- name: hello-world
image: hello_world:v2
ports:
- containerPort: 8080
执行命令查看服务:kubectl get svc -owide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
hello-world NodePort 10.98.7.230 80:31611/TCP 3d21h app=hello-world
kubernetes ClusterIP 10.96.0.1 443/TCP 3d22h
crul 10.98.7.230(或curl 10.98.7.230:80)
显示Hello World!则表明部署成功
重启动Docker(主从结点都执行)
systemctl restart docker
重启动kubelet(主从结点都执行)
systemctl restart kubelet
查看容器启动情况(主从结点都执行)
docker ps -a
docker start $(docker ps -a | awk ‘{ print $1}’ | tail -n +2) # 部分组件有依赖性,执行后部分组件未启动,可重复执行该命令
查看端口是否启动
ss -utnlp | grep 6443
显示这类信息表示已经启动:tcp LISTEN 0 128 [::]:6443 [::] users:((“kube-apiserver”,pid=12905,fd=7))
查看相关组件是否正常执行
kubectl get pods -n kube-system
显示如下信息表示已经正常
coredns-7f6cbbb7b8-9dh27 1/1 Running 1 (15m ago) 3d22h
coredns-7f6cbbb7b8-t4kn6 1/1 Running 1 (15m ago) 3d22h
etcd-master 1/1 Running 2 (2m57s ago) 3d22h
kube-apiserver-master 1/1 Running 2 (2m52s ago) 3d22h
kube-controller-manager-master 1/1 Running 4 (2m58s ago) 3d22h
kube-proxy-ntk5w 1/1 Running 1 (15m ago) 3d22h
kube-proxy-pmh98 1/1 Running 2 (2m58s ago) 3d22h
kube-proxy-wjths 1/1 Running 1 (15m ago) 3d22h
kube-scheduler-master 1/1 Running 4 (2m58s ago) 3d22h
查看你dashboard是否正常执行,未安装可不执行
kubectl get pods -n kubernetes-dashboard
kubectl label node worker1 node-role.kubernetes.io/worker=worker
kubectl delete pod -n --force --grace-period=0
单节点集群问题
当创建单机版的 k8s 时,这个时候 master 节点是默认不允许调度 pod
解决:执行命令将 master 标记为可调度即可 ,即删除污点
kubectl taint nodes --all node-role.kubernetes.io/master-