1. 程式人生 > >DOCKER學習(二)--Kubernetes(v1.12.1)叢集安裝

DOCKER學習(二)--Kubernetes(v1.12.1)叢集安裝

本文使用Kubeadm安裝Kubernetes

kubeadm是Kubernetes官方提供的用於快速安裝Kubernetes叢集的工具,伴隨Kubernetes每個版本的釋出都會同步更新,kubeadm會對叢集配置方面的一些實踐做調整,通過實驗kubeadm可以學習到Kubernetes官方在叢集配置上一些新的最佳實踐。

1.準備

1.1 系統配置

系統如下:

  • Ubuntu 16.04+
  • Debian 9
  • CentOS 7
  • RHEL 7
  • Fedora 25/26 (best-effort)
  • HypriotOS v1.0.1+
  • Container Linux (tested with 1800.6.0)

記憶體與CPU:

  • 2 GB or more of RAM per machine (any less will leave little room for your apps)
  • 2 CPUs or more

1.2 系統配置

如果各個主機啟用了防火牆,需要開放Kubernetes各個元件所需要的埠:

Master node(s)

Protocol Direction Port Range Purpose Used By
TCP Inbound 6443* Kubernetes API server All
TCP Inbound 2379-2380 etcd server client API kube-apiserver, etcd
TCP Inbound 10250 Kubelet API Self, Control plane
TCP Inbound 10251 kube-scheduler Self
TCP Inbound 10252 kube-controller-manager Self

Worker node(s)

Protocol Direction Port Range Purpose Used By
TCP Inbound 10250 Kubelet API Self, Control plane
TCP Inbound 30000-32767 NodePort Services** All

或者禁用防火牆:

systemctl stop firewalld
systemctl disable firewalld

禁用SELINUX:

setenforce 0
vi /etc/selinux/config
SELINUX=disabled

建立/etc/sysctl.d/k8s.conf檔案,新增如下內容:

cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF

執行命令使修改生效:

modprobe br_netfilter
sysctl -p /etc/sysctl.d/k8s.conf

1.3 修改配置主機名

vim /etc/hosts

#新增相應的主機資訊
192.168.0.10 app-tahjv1fe-1

1.4 安裝docker

安裝docker之後需要確認一下iptables filter表中FOWARD鏈的預設策略(pollicy)為ACCEPT

iptables -nvL
Chain INPUT (policy ACCEPT 45403 packets, 59M bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DOCKER-USER  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
    0     0 DOCKER-ISOLATION-STAGE-1  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
    0     0 ACCEPT     all  --  *      docker0  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
    0     0 DOCKER     all  --  *      docker0  0.0.0.0/0            0.0.0.0/0           
    0     0 ACCEPT     all  --  docker0 !docker0  0.0.0.0/0            0.0.0.0/0           
    0     0 ACCEPT     all  --  docker0 docker0  0.0.0.0/0            0.0.0.0/0           
    0     0 ACCEPT     all  --  *      docker_gwbridge  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
    0     0 DOCKER     all  --  *      docker_gwbridge  0.0.0.0/0            0.0.0.0/0           
    0     0 ACCEPT     all  --  docker_gwbridge !docker_gwbridge  0.0.0.0/0            0.0.0.0/0           
    0     0 DROP       all  --  docker_gwbridge docker_gwbridge  0.0.0.0/0            0.0.0.0/0 

Docker從1.13版本開始調整了預設的防火牆規則,禁用了iptables filter表中FOWARD鏈,這樣會引起Kubernetes叢集中跨Node的Pod無法通訊。但這裡通過安裝docker 1806,發現預設策略又改回了ACCEPT,這個不知道是從哪個版本改回的。

如果是DROP狀態,使用一下語句開啟:

sed -i "13i ExecStartPost=/usr/sbin/iptables -P FORWARD ACCEPT" /usr/lib/systemd/system/docker.service

然後重新啟動docker:

systemctl daemon-reload
systemctl restart docker

2. 使用Kubeadm安裝kubernetes

2.1安裝kubeadm和kubelet

在各節點安裝kubeadm和kubelet,這裡配置使用aliyun的yum源:

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
yum makecache fast
yum install -y kubelet kubeadm kubectl

執行kubelet –help可以看到原來kubelet的絕大多數命令列flag引數都被DEPRECATED了,如:

--address 0.0.0.0   The IP address for the Kubelet to serve on (set to 0.0.0.0 for all IPv4 interfaces and `::` for all IPv6 interfaces) (default 0.0.0.0) (DEPRECATED: This parameter should be set via the config file specified by the Kubelet's --config flag. See https://kubernetes.io/docs/tasks/administer-cluster/kubelet-config-file/ for more information.)

而官方推薦我們使用–config指定配置檔案,並在配置檔案中指定原來這些flag所配置的內容。這也是Kubernetes為了支援動態Kubelet配置(Dynamic Kubelet Configuration)才這麼做的。kubelet的配置檔案必須是json或yaml格式。

Kubernetes 1.8開始要求關閉系統的Swap,如果不關閉,預設配置下kubelet將無法啟動。或者使用配置檔案去掉這個限制。

關閉系統swap:

swapoff -a

一般當前使用的伺服器可能還執行其他服務,關閉swap可能會對其他服務產生影響,所以這裡修改kubelet的配置去掉這個限制。修改配置檔案:

vi /etc/sysconfig/kubelet

#add args to KUBELET_EXTRA_ARGS
KUBELET_EXTRA_ARGS=--fail-swap-on=false

2.2 使用kubeadm init初始化服務

在各節點開啟機啟動kubelet服務

systemctl enable kubelet

接下來使用kubeadm初始化叢集,選擇app-tahjv1fe-1作為Master Node,在app-tahjv1fe-1上執行下面的命令:

kubeadm init \
  --kubernetes-version=v1.12.1 \
  --pod-network-cidr=10.244.0.0/16 \
  --apiserver-advertise-address=192.168.0.10 \
  --apiserver-cert-extra-sans=$(hostname) \
  --ignore-preflight-errors=Swap

可以使用--insecure-port=port修改api server監聽埠。

因為我們選擇flannel作為Pod網路外掛,所以上面的命令指定–pod-network-cidr=10.244.0.0/16。

直接執行初始化語句會報錯:

[ERROR ImagePull]: failed to pull image k8s.gcr.io/kube-apiserver:v1.12.1
[ERROR ImagePull]: failed to pull image k8s.gcr.io/kube-controller-manager:v1.12.1
[ERROR ImagePull]: failed to pull image k8s.gcr.io/kube-scheduler:v1.12.1
[ERROR ImagePull]: failed to pull image k8s.gcr.io/kube-proxy:v1.12.1
[ERROR ImagePull]: failed to pull image k8s.gcr.io/pause:3.1
[ERROR ImagePull]: failed to pull image k8s.gcr.io/etcd:3.2.24
[ERROR ImagePull]: failed to pull image k8s.gcr.io/coredns:1.2.2

k8s.gcr.io是谷歌域名,在國內不能直接訪問,無法直接從google拉取映象。

解決辦法:新建指令碼,從dockerhub上拉取相應的映象,然後重新tag到kubeadm所需要的名稱

vim ./kubernetes.sh

images=(kube-apiserver:v1.12.1 kube-controller-manager:v1.12.1 kube-scheduler:v1.12.1 kube-proxy:v1.12.1 pause:3.1 etcd:3.2.24 coredns:1.2.2)
for imageName in ${images[*]}
do
  docker pull fengzos/$imageName
  docker tag fengzos/$imageName k8s.gcr.io/$imageName
  docker rmi fengzos/$imageName
done

chmod +x ./kubernetes.sh

./kubernetes.sh

執行指令碼之後再進行初始化操作。如果初始化失敗需要重新進行初始化,需要先進行reset一下:

kubeadm reset

然後再執行初始化指令碼。執行成功如下:

[bootstraptoken] using token: 62u3or.7rvaxpgra3r9c1u9
[bootstraptoken] configured RBAC rules to allow Node Bootstrap tokens to post CSRs in order for nodes to get long term certificate credentials
[bootstraptoken] configured RBAC rules to allow the csrapprover controller automatically approve CSRs from a Node Bootstrap Token
[bootstraptoken] configured RBAC rules to allow certificate rotation for all node client certificates in the cluster
[bootstraptoken] creating the "cluster-info" ConfigMap in the "kube-public" namespace
[addons] Applied essential addon: CoreDNS
[addons] Applied essential addon: kube-proxy

Your Kubernetes master 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/

You can now join any number of machines by running the following on each node
as root:

  kubeadm join 192.168.0.10:6443 --token 62u3or.7rvaxpgra3r9c1u9 --discovery-token-ca-cert-hash sha256:0fe59a4d41817cff8d3190a0e3c541219957abd938c4f9243d03782523c663dc

把生成的join命令儲存下來,留待其他節點加入叢集時使用。

下面的命令是配置常規使用者如何使用kubectl訪問叢集,為當前使用者配置kubernetes的配置檔案:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

使用 kubectl version檢視叢集情況:

# kubectl version
Client Version: version.Info{Major:"1", Minor:"12", GitVersion:"v1.12.1", GitCommit:"4ed3216f3ec431b140b1d899130a69fc671678f4", GitTreeState:"clean", BuildDate:"2018-10-05T16:46:06Z", GoVersion:"go1.10.4", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"12", GitVersion:"v1.12.1", GitCommit:"4ed3216f3ec431b140b1d899130a69fc671678f4", GitTreeState:"clean", BuildDate:"2018-10-05T16:36:14Z", GoVersion:"go1.10.4", Compiler:"gc", Platform:"linux/amd64"}

檢視一下叢集狀態:

kubectl get cs
NAME                 STATUS    MESSAGE              ERROR
controller-manager   Healthy   ok
scheduler            Healthy   ok
etcd-0               Healthy   {"health": "true"}

檢視節點資訊:

# kubectl get node -o wide
NAME            STATUS     ROLES    AGE    VERSION   INTERNAL-IP     EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION          CONTAINER-RUNTIME
app-tahjv1fe-1   NotReady   master   176m   v1.12.1   192.168.0.10   <none>        CentOS Linux 7 (Core)   3.10.0-862.el7.x86_64   docker://18.6.1

在這裡可以看到1.12版本的kubeadm額外給app-tahjv1fe-1節點設定了一個汙點(Taint):node.kubernetes.io/not-ready:NoSchedule,很容易理解,即如果節點還沒有ready之前,是不接受排程的。可是如果Kubernetes的網路外掛還沒有部署的話,節點是不會進入ready狀態的。

2.3 安裝Pod Network

接下來安裝flannel network add-on:

mkdir -p ~/k8s/
cd ~/k8s
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubectl apply -f  kube-flannel.yml

clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.extensions/kube-flannel-ds-amd64 created
daemonset.extensions/kube-flannel-ds-arm64 created
daemonset.extensions/kube-flannel-ds-arm created
daemonset.extensions/kube-flannel-ds-ppc64le created
daemonset.extensions/kube-flannel-ds-s390x created

這裡注意kube-flannel.yml這個檔案裡的flannel的映象是0.10.0,quay.io/coreos/flannel:v0.10.0-amd64

如果Node有多個網絡卡的話,目前需要在kube-flannel.yml中使用--iface引數指定叢集主機內網網絡卡的名稱,否則可能會出現dns無法解析。flanneld啟動引數加上--iface=<iface-name>

......
containers:
      - name: kube-flannel
        image: quay.io/coreos/flannel:v0.10.0-amd64
        command:
        - /opt/bin/flanneld
        args:
        - --ip-masq
        - --kube-subnet-mgr
        - --iface=eth1
......

本次按上面的步驟部署flannel,發現沒有效果,檢視一下叢集中的daemonset:

# kubectl get ds -l app=flannel -n kube-system
NAME                      DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR                     AGE
kube-flannel-ds-amd64     1         1         1       1            1           beta.kubernetes.io/arch=amd64     38m
kube-flannel-ds-arm       0         0         0       0            0           beta.kubernetes.io/arch=arm       38m
kube-flannel-ds-arm64     0         0         0       0            0           beta.kubernetes.io/arch=arm64     38m
kube-flannel-ds-ppc64le   0         0         0       0            0           beta.kubernetes.io/arch=ppc64le   38m
kube-flannel-ds-s390x     0         0         0       0            0           beta.kubernetes.io/arch=s390x     38m

結合kube-flannel.yml,fannel官方的部署yaml檔案是要在叢集中建立5個針對不同平臺的DaemonSet,通過Node的Label beta.kubernetes.i/oarch,在對應不同平臺的Node節點上啟動flannel的容器。當前的app-tahjv1fe-1節點是beta.kubernetes.i/oarch=amd64,因此對於kube-flannel-ds-amd64這個DaemonSet來說,它的DESIRED數量應該為1才對。

使用kubectl get pod --all-namespaces -o wide確保所有的Pod都處於Running狀態。

# kubectl get pod --all-namespaces -o wide
NAMESPACE     NAME                                     READY   STATUS    RESTARTS   AGE   IP             NODE             NOMINATED NODE
kube-system   coredns-576cbf47c7-f4w7l                 1/1     Running   0          64m   10.244.0.3     app-tahjv1fe-1   <none>
kube-system   coredns-576cbf47c7-xcgpf                 1/1     Running   0          64m   10.244.0.2     app-tahjv1fe-1   <none>
kube-system   etcd-app-tahjv1fe-1                      1/1     Running   1          63m   192.168.0.10   app-tahjv1fe-1   <none>
kube-system   kube-apiserver-app-tahjv1fe-1            1/1     Running   0          63m   192.168.0.10   app-tahjv1fe-1   <none>
kube-system   kube-controller-manager-app-tahjv1fe-1   1/1     Running   7          64m   192.168.0.10   app-tahjv1fe-1   <none>
kube-system   kube-flannel-ds-amd64-8qp72              1/1     Running   0          42m   192.168.0.10   app-tahjv1fe-1   <none>
kube-system   kube-proxy-jr42n                         1/1     Running   0          64m   192.168.0.10   app-tahjv1fe-1   <none>
kube-system   kube-scheduler-app-tahjv1fe-1            1/1     Running   7          63m   192.168.0.10   app-tahjv1fe-1   <none>

2.4 master node 參與工作負載

使用kubeadm初始化的叢集,出於安全考慮Pod不會被排程到Master Node上,也就是說Master Node不參與工作負載。這是因為當前的master節點app-tahjv1fe-1被打上了node-role.kubernetes.io/master:NoSchedule的汙點,可以修改這個配置,讓master參與工作排程,去掉這個汙點使app-tahjv1fe-1參與工作負載:

# kubectl taint nodes app-tahjv1fe-1 node-role.kubernetes.io/master-
node "app-tahjv1fe-1" untainted

2.5 向Kubernetes叢集中新增Node節點

下面我們將app-tahjv1fe-2這個主機新增到Kubernetes叢集中,因為我們同樣在app-tahjv1fe-2上的kubelet的啟動引數中去掉了必須關閉swap的限制,所以同樣需要–ignore-preflight-errors=Swap這個引數。 在app-tahjv1fe-2上執行:

kubeadm join 192.168.0.10:6443 --token 62u3or.7rvaxpgra3r9c1u9 --discovery-token-ca-cert-hash sha256:0fe59a4d41817cff8d3190a0e3c541219957abd938c4f9243d03782523c663dc --ignore-preflight-errors=Swap

......
This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.

Run 'kubectl get nodes' on the master to see this node join the cluster.

app-tahjv1fe-2加入叢集很是順利,下面在master節點上執行命令檢視叢集中的節點:

# kubectl get node
NAME             STATUS   ROLES    AGE    VERSION
app-tahjv1fe-1   Ready    master   149m   v1.12.1
app-tahjv1fe-2   Ready    <none>   52m    v1.12.1

如何從叢集中移除Node

如果需要從叢集中移除app-tahjv1fe-2這個Node執行下面的命令:

在master節點上執行:

kubectl drain app-tahjv1fe-2 --delete-local-data --force --ignore-daemonsets
kubectl delete node app-tahjv1fe-2

在app-tahjv1fe-2上執行:

kubeadm reset
ifconfig cni0 down
ip link delete cni0
ifconfig flannel.1 down
ip link delete flannel.1
rm -rf /var/lib/cni/

3.Kubernetes常用元件部署

越來越多的公司和團隊開始使用Helm這個Kubernetes的包管理器,我們也將使用Helm安裝Kubernetes的常用元件。

3.1 Helm的安裝

Helm由helm客戶端和tiller服務端組成,Helm的安裝十分簡單。 下載helm命令列工具到master節點app-tahjv1fe-1的/usr/local/bin下,這裡下載的2.11.0版本:

wget https://storage.googleapis.com/kubernetes-helm/helm-v2.11.0-linux-amd64.tar.gz
tar -zxvf helm-v2.11.0-linux-amd64.tar.gz
cd linux-amd64/
cp helm /usr/local/bin/

為了安裝服務端tiller,還需要在這臺機器上配置好kubectl工具和kubeconfig檔案,確保kubectl工具可以在這臺機器上訪問apiserver且正常使用。 這裡的app-tahjv1fe-1節點以及配置好了kubectl。

因為Kubernetes APIServer開啟了RBAC訪問控制,所以需要建立tiller使用的service account: tiller並分配合適的角色給它。這裡簡單起見直接分配cluster-admin這個叢集內建的ClusterRole給它。建立rbac-config.yaml檔案:

cd ~/k8s/
vim rbac-config.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: tiller
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: tiller
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
  - kind: ServiceAccount
    name: tiller
    namespace: kube-system
# kubectl create -f rbac-config.yaml
serviceaccount/tiller created
clusterrolebinding.rbac.authorization.k8s.io/tiller created

接下來使用helm部署tiller:

helm init --service-account tiller --skip-refresh

如果直接執行部署語句,要連結 https://kubernetes-charts.storage.googleapis.com去下載映象;在國內這個地址不能直接訪問,所以需要下載其他映象;docker pull fengzos/tiller:v2.11.0這個映象是直接從gcr.io/kubernetes-helm/tiller:v2.11.0繼承過來的,可以直接使用。

docker pull fengzos/tiller
helm init --service-account tiller --upgrade -i fengzos/tiller:latest  --skip-refresh

tiller預設被部署在k8s叢集中的kube-system這個namespace下:

# kubectl get pod -n kube-system -l app=helm
NAME                            READY   STATUS    RESTARTS   AGE
tiller-deploy-8999b76d9-nx57p   1/1     Running   0          2m6s

3.2 使用Helm部署Nginx Ingress

為了便於將叢集中的服務暴露到叢集外部,從叢集外部訪問,接下來使用Helm將Nginx Ingress部署到Kubernetes上。 Nginx Ingress Controller被部署在Kubernetes的邊緣節點上,這裡簡單起見,只有一個edge節點。

我們將app-tahjv1fe-1(192.168.0.10)同時做為邊緣節點,打上Label:

# kubectl label node app-tahjv1fe-1 node-role.kubernetes.io/edge=
node/app-tahjv1fe-1 labeled
# kubectl get node
NAME             STATUS   ROLES         AGE     VERSION
app-tahjv1fe-1   Ready    edge,master   4h59m   v1.12.1
app-tahjv1fe-2   Ready    <none>        3h22m   v1.12.1

3.3 使用Helm部署dashboard

ingress:
  enabled: true
  image: 
    repository: fengzos/kubernetes-dashboard-amd64
    tag: "v1.10.0"
    pullPolicy: IfNotPresent
  annotations:
    nginx.ingress.kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
    nginx.ingress.kubernetes.io/secure-backends: "true"
rbac:
  clusterAdminRole: true
helm install stable/kubernetes-dashboard \
-n kubernetes-dashboard \
--namespace kube-system  \
-f kubernetes-dashboard.yaml
#kubectl -n kube-system get secret | grep kubernetes-dashboard-token
kubernetes-dashboard-token-tjj25                 kubernetes.io/service-account-token   3         37s

#kubectl describe -n kube-system secret/kubernetes-dashboard-token-tjj25
Name:         kubernetes-dashboard-token-tjj25
Namespace:    kube-system
Labels:       <none>
Annotations:  kubernetes.io/service-account.name=kubernetes-dashboard
              kubernetes.io/service-account.uid=d19029f0-9cac-11e8-8d94-080027db403a

Type:  kubernetes.io/service-account-token

Data
====
namespace:  11 bytes
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJrdWJlcm5ldGVzLWRhc2hib2FyZC10b2tlbi10amoyNSIsImt1YmVy

登入https://192.168.0.10,然後使用token登入

相關推薦

DOCKER學習--Kubernetes(v1.12.1)叢集安裝

本文使用Kubeadm安裝Kubernetes kubeadm是Kubernetes官方提供的用於快速安裝Kubernetes叢集的工具,伴隨Kubernetes每個版本的釋出都會同步更新,kubeadm會對叢集配置方面的一些實踐做調整,通過實驗kubeadm可以學習到

docker學習

ner 命名 post latest nbsp 動態 應用 test 自己的 基本概念: Docker包括三個基本概念:  鏡像(Image): 特殊的文件系統,提供容器運行時所需的程序、庫、資源、配置文件。鏡像不包含動態數據,內容在構建後不會被改變。  容器(Contai

docker學習——docker的基本概念及基礎使用

一張圖概括整篇文章內容: 來自:https://medium.com/@nagarwal/lifecycle-of-docker-container-d2da9f85959 lxc->libcontainer->runC OCI(Open Container I

Docker學習- Docker 安裝 Jenkins

## 一、拉取映象 我這裡安裝的版本是2.222.3-centos,可以去這裡獲取你需要的版本: https://hub.docker.com/_/jenkins?tab=tags ```shell docker pull jenkins/jenkins:2.222.3-centos ``` ## 二、建立本

reids叢集學習使用jedis實現redis叢集客戶端

上一節我記錄瞭如何搭建redis官方的叢集,這節我就開始講怎麼用jedis實現叢集環境下的客戶端。 jedis中實現叢集的客戶端類是redis.clients.jedis.JedisClust

使用kubeadm快速部署Kubernetes(v1.12.1)叢集---來源:馬哥教育馬哥原創

使用kubeadm快速部署Kubernetes(v1.12.1)叢集------來源:馬哥教育馬哥原創 Kubernetes技術已經成為了原生雲技術的事實標準,它是目前基礎軟體領域最為熱門的分散式排程和管理平臺。於是,Kubernetes也幾乎成了時下開發工程師和運維工程師必備的技能之一。 一、主機環境預

國內環境Kubernetes v1.12.1安裝與配置

一、些重要概念 Cluster:計算、儲存、網路資源的總和。Kubernetes的各種基於容器的應用都是執行在這些資源上的。 Master:Kubernetes的大腦,負責排程各種計算資源。Master可以是物理機或虛擬機器,多個Master可以同時執行,並實現HA。Master

Kubernetes權威指南第2版》學習一個簡單的例子

stop 輸入 rtu gist 用戶名 server 遠程 dock netstat 1: 安裝VirtualBox, 並下載CentOS-7-x86_64-DVD-1708.iso, 安裝centOS7,具體過程可以百度。 2:開啟centOS的SSH, 步驟如下:

Docker系列:通過Docker安裝使用 Kubernetes K8s

Docker社群版從17.12版本開始已經提供了對Kubernetes的支援。但是由於其安裝過程依賴的映象服務在國內訪問很不穩定,很多朋友都無法配置成功。我們提供了一個簡單的工具幫助大家開啟Docker社群版的Kubernetes功能。 我們需要先安裝好Docker CE的最新版,18.03 - 18.09

kubernetes v1.12.0叢集部署二進位制方式+基於CA簽名雙向數字證書認證方式

kubernetes 最簡單的方式是通過yum install kubernetes 直接安裝,但是預設安裝的是v5版本的kubernetes,所以不推薦使用,還有一種是在v1.4版本開始引入了的kubeadm工具一鍵部署,但是如果 沒有訪問gcr.io的網路環境的話部署過程

Docker基礎學習-Docker安裝和部署

一,在Windows中安裝 Docker 1,Docker的執行環境 (1)Linux容器技術 (2)作業系統級別的虛擬化 (3)依賴於Linux核心的Namespace和Cgroups 下面

docker入門學習mysql安裝

exec password 工具 出了 mysql8 .com cal 遠程連接 加密 一、下載mysql鏡像     docker pull mysql 二、啟動mysql無效    [root@localhost ~]# docker run --name

爬蟲庫之BeautifulSoup學習

不必要 baidu html left 官方 blank 正則 文本處理 比較 BeautifulSoup官方介紹文檔:https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html 四大對象種

cocos2dx 3.1從零學習——菜單、場景切換、場景傳值

天空 ptr select 特效 new 要點 綁定 使用 water 回想一下上一篇的內容,我們已經學會了創建一個新的場景scene,加入sprite和label到層中。掌握了定時事件schedule。我們能夠順利的寫出打飛機的主場景框架。 上一篇的內容我練習了七個新

redis學習——String數據類型

字符串類型 創建 復雜度 back nbsp 命令 時間復雜度 value con 一、概述 字符串類型是Redis中最為基礎的數據存儲類型,它在Redis中是二進制安全的,這便意味著該類型可以接受任何格式的數據,如JPEG圖像數據或Json對象描述信息等。在R

Linux 網卡驅動學習網絡驅動接口小結

-a key 頻率 網絡 上網 ren 網絡設備 ews 入口 【摘要】前文我們分析了一個虛擬硬件的網絡驅動樣例。從中我們看到了網絡設備的一些接口。事實上網絡設備驅動和塊設備驅動的功能比較相似,都是發送和接收數據包(數據請求)。當然它們實際是有非常多不同

ext2文件系統學習—— 目錄磁盤結構

echo free 文件格式 htm file 目錄結構 bitmap 點號 name 創建鏡像、mount等操作和上一篇一樣,測試目錄結構如下: 一些文件系統信息如下: Block size: 1024 Inodes per group: 1

Docker入門

docker安裝 docker基礎命令 一、Docker相關概念1.Docker: namespace,cgroup: 解決方案: lxc,openvz lxc:linux containers docker最初就是lxc的封裝版本。 docker engine/docker server:輸

RabbitMQ學習工作隊列

lose borde 阻塞 lpad mes getc actor 使用 處理 1.工作隊列(Work Queue)又叫任務隊列(Task Queue)指將任務分發個多個消費者。 2.實際操作: 這裏使用一個生產者產生多條數據提供給3個消費者

JAVA學習 String使用equals方法和==分別比較的是什麽?

找到 基礎上 stirng print 大小 obj lis 分配 ret String使用的equals方法和==的區別 equals方法和==的區別 首先大家知道,String既可以作為一個對象來使用,又可以作為一個基本類型來使用。這裏指的作為一個基本類型來使用只是