mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-23 19:56:01 +00:00
Merge pull request #4791 from roberthbailey/update-sh
Remove host ports from the update demo and update tests
This commit is contained in:
commit
95faafa76d
@ -803,6 +803,7 @@ function test-setup {
|
||||
detect-project
|
||||
|
||||
# Open up port 80 & 8080 so common containers on minions can be reached
|
||||
# TODO(roberthbailey): Remove this once we are no longer relying on hostPorts.
|
||||
gcloud compute firewall-rules create \
|
||||
--project "${PROJECT}" \
|
||||
--target-tags "${MINION_TAG}" \
|
||||
|
@ -26,28 +26,20 @@ $ cd kubernetes
|
||||
$ hack/dev-build-and-up.sh
|
||||
```
|
||||
|
||||
If you are running your cluster on GCE (the default), you may need to open the firewall for port 8080 using the [console](https://console.developer.google.com) or the `gcloud` tool. The following command will allow traffic from any source to instances tagged `kubernetes-minion`:
|
||||
|
||||
```bash
|
||||
$ gcloud compute firewall-rules create \
|
||||
--allow tcp:8080 --target-tags=kubernetes-minion \
|
||||
kubernetes-minion-8080
|
||||
```
|
||||
|
||||
### Step One: Turn up the UX for the demo
|
||||
|
||||
You can use bash job control to run this in the background. This can sometimes spew to the output so you could also run it in a different terminal.
|
||||
You can use bash job control to run this in the background (note that you must use the default port -- 8001 -- for the following demonstration to work properly). This can sometimes spew to the output so you could also run it in a different terminal.
|
||||
|
||||
```
|
||||
$ ./cluster/kubectl.sh proxy --www=local/ &
|
||||
+ ./cluster/kubectl.sh proxy --www=local/
|
||||
$ ./cluster/kubectl.sh proxy --www=examples/update-demo/local/ &
|
||||
+ ./cluster/kubectl.sh proxy --www=examples/update-demo/local/
|
||||
I0218 15:18:31.623279 67480 proxy.go:36] Starting to serve on localhost:8001
|
||||
```
|
||||
|
||||
Now visit the the [demo website](http://localhost:8001/static). You won't see anything much quite yet.
|
||||
|
||||
### Step Two: Run the controller
|
||||
Now we will turn up two replicas of an image. They all serve on port 8080, mapped to internal port 80
|
||||
Now we will turn up two replicas of an image. They all serve on internal port 80.
|
||||
|
||||
```bash
|
||||
$ ./cluster/kubectl.sh create -f examples/update-demo/nautilus-rc.yaml
|
||||
|
@ -12,8 +12,7 @@ desiredState:
|
||||
- name: update-demo
|
||||
image: kubernetes/update-demo:kitten
|
||||
ports:
|
||||
- hostPort: 8080
|
||||
containerPort: 80
|
||||
- containerPort: 80
|
||||
protocol: TCP
|
||||
labels:
|
||||
name: update-demo
|
||||
|
8
examples/update-demo/local/angular.min.js.map
Normal file
8
examples/update-demo/local/angular.min.js.map
Normal file
File diff suppressed because one or more lines are too long
@ -22,9 +22,9 @@ limitations under the License.
|
||||
</head>
|
||||
<body ng-controller="ButtonsCtrl">
|
||||
<div ng-repeat="server in servers" class="pod">
|
||||
<img src="http://{{server.ip}}:8080/{{server.image}}" height="100px" width="100px" />
|
||||
<b>ID:</b> {{server.id}}<br>
|
||||
<b>Host:</b> <a href="http://{{server.ip}}:8080/data.json">{{server.host}}</a><br>
|
||||
<img src="http://localhost:8001/api/v1beta1/proxy/pods/{{server.podId}}/{{server.image}}" height="100px" width="100px" />
|
||||
<b>ID:</b> {{server.podId}}<br>
|
||||
<b>Host:</b> <a href="http://localhost:8001/api/v1beta1/proxy/pods/{{server.podId}}/data.json">{{server.host}}</a><br>
|
||||
<b>Status:</b> {{server.status}}<br>
|
||||
<b>Image:</b> {{server.dockerImage}}<br>
|
||||
<b>Labels:</b>
|
||||
|
@ -17,27 +17,25 @@ limitations under the License.
|
||||
var base = "http://localhost:8001/api/v1beta1/";
|
||||
|
||||
var updateImage = function($http, server) {
|
||||
$http.get("http://" + server.ip + ":8080/data.json")
|
||||
$http.get(base + "proxy/pods/" + server.podId + "/data.json")
|
||||
.success(function(data) {
|
||||
server.image = data.image;
|
||||
console.log(data);
|
||||
server.image = data.image;
|
||||
})
|
||||
.error(function(data) {
|
||||
server.image = "";
|
||||
console.log(data);
|
||||
server.image = "";
|
||||
});
|
||||
};
|
||||
|
||||
var updateServer = function($http, server) {
|
||||
$http.get(base + "pods/" + server.id)
|
||||
$http.get(base + "pods/" + server.podId)
|
||||
.success(function(data) {
|
||||
console.log(data);
|
||||
server.ip = data.currentState.hostIP;
|
||||
server.labels = data.labels;
|
||||
server.host = data.currentState.host.split('.')[0];
|
||||
server.status = data.currentState.status;
|
||||
|
||||
server.dockerImage = data.currentState.info["update-demo"].Image;
|
||||
server.dockerImage = data.currentState.info["update-demo"].image;
|
||||
updateImage($http, server);
|
||||
})
|
||||
.error(function(data) {
|
||||
@ -62,7 +60,7 @@ var ButtonsCtrl = function ($scope, $http, $interval) {
|
||||
var getServer = function($scope, id) {
|
||||
var servers = $scope.servers;
|
||||
for (var i = 0; i < servers.length; ++i) {
|
||||
if (servers[i].id == id) {
|
||||
if (servers[i].podId == id) {
|
||||
return servers[i];
|
||||
}
|
||||
}
|
||||
@ -89,7 +87,7 @@ var update = function($scope, $http) {
|
||||
}
|
||||
var server = getServer($scope, pod.id);
|
||||
if (server == null) {
|
||||
server = { "id": pod.id };
|
||||
server = { "podId": pod.id };
|
||||
}
|
||||
newServers.push(server);
|
||||
}
|
||||
|
@ -13,8 +13,7 @@ desiredState:
|
||||
- name: update-demo
|
||||
image: kubernetes/update-demo:nautilus
|
||||
ports:
|
||||
- hostPort: 8080
|
||||
containerPort: 80
|
||||
- containerPort: 80
|
||||
protocol: TCP
|
||||
labels:
|
||||
name: update-demo
|
||||
|
@ -103,9 +103,7 @@ function validate() {
|
||||
continue
|
||||
fi
|
||||
|
||||
|
||||
host_ip=$($KUBECTL get pods "$id" -o template --template='{{.currentState.hostIP}}')
|
||||
curl -s --max-time 5 --fail http://${host_ip}:8080/data.json \
|
||||
curl -s --max-time 5 --fail http://localhost:8011/api/v1beta1/proxy/pods/${id}/data.json \
|
||||
| grep -q ${container_image_version} || {
|
||||
echo " ${id} is running the right image but curl to contents failed or returned wrong info"
|
||||
continue
|
||||
@ -124,10 +122,15 @@ function teardown() {
|
||||
echo "Cleaning up test artifacts"
|
||||
${KUBECTL} stop rc update-demo-kitten || true
|
||||
${KUBECTL} stop rc update-demo-nautilus || true
|
||||
kill -TERM "${kubectl_proxy_pid:-}" &> /dev/null || true
|
||||
}
|
||||
|
||||
trap "teardown" EXIT
|
||||
|
||||
# Launch a local proxy to the apiserver
|
||||
${KUBECTL} proxy --port=8011 &
|
||||
kubectl_proxy_pid=$!
|
||||
|
||||
# Launch a container
|
||||
${KUBECTL} create -f "${KUBE_ROOT}/examples/update-demo/nautilus-rc.yaml"
|
||||
validate 2 nautilus
|
||||
|
@ -35,13 +35,34 @@ const (
|
||||
kittenImage = "kubernetes/update-demo:kitten"
|
||||
updateDemoSelector = "name=update-demo"
|
||||
updateDemoContainer = "update-demo"
|
||||
kubectlProxyPort = 8011
|
||||
)
|
||||
|
||||
var _ = Describe("kubectl", func() {
|
||||
|
||||
updateDemoRoot := filepath.Join(root, "examples/update-demo")
|
||||
nautilusPath := filepath.Join(updateDemoRoot, "nautilus-rc.yaml")
|
||||
kittenPath := filepath.Join(updateDemoRoot, "kitten-rc.yaml")
|
||||
// Constants.
|
||||
var (
|
||||
updateDemoRoot = filepath.Join(root, "examples/update-demo")
|
||||
nautilusPath = filepath.Join(updateDemoRoot, "nautilus-rc.yaml")
|
||||
kittenPath = filepath.Join(updateDemoRoot, "kitten-rc.yaml")
|
||||
)
|
||||
|
||||
var cmd *exec.Cmd
|
||||
|
||||
BeforeEach(func() {
|
||||
cmd = kubectlCmd("proxy", fmt.Sprintf("--port=%d", kubectlProxyPort))
|
||||
if err := cmd.Start(); err != nil {
|
||||
Failf("Unable to start kubectl proxy: %v", err)
|
||||
}
|
||||
})
|
||||
|
||||
AfterEach(func() {
|
||||
// Kill the proxy
|
||||
if cmd.Process != nil {
|
||||
Logf("Stopping kubectl proxy (pid %d)", cmd.Process.Pid)
|
||||
cmd.Process.Kill()
|
||||
}
|
||||
})
|
||||
|
||||
It("should create and stop a replication controller", func() {
|
||||
defer cleanup(nautilusPath)
|
||||
@ -106,8 +127,6 @@ func validateController(image string, replicas int, timeout time.Duration) {
|
||||
|
||||
getImageTemplate := fmt.Sprintf(`--template={{(index .currentState.info "%s").image}}`, updateDemoContainer)
|
||||
|
||||
getHostIPTemplate := "--template={{.currentState.hostIP}}"
|
||||
|
||||
By(fmt.Sprintf("waiting for all containers in %s pods to come up.", updateDemoSelector))
|
||||
for start := time.Now(); time.Since(start) < timeout; time.Sleep(5 * time.Second) {
|
||||
getPodsOutput := runKubectl("get", "pods", "-o", "template", getPodsTemplate, "-l", updateDemoSelector)
|
||||
@ -117,32 +136,31 @@ func validateController(image string, replicas int, timeout time.Duration) {
|
||||
continue
|
||||
}
|
||||
var runningPods []string
|
||||
for _, podId := range pods {
|
||||
running := runKubectl("get", "pods", podId, "-o", "template", getContainerStateTemplate)
|
||||
for _, podID := range pods {
|
||||
running := runKubectl("get", "pods", podID, "-o", "template", getContainerStateTemplate)
|
||||
if running == "false" {
|
||||
By(fmt.Sprintf("%s is created but not running", podId))
|
||||
Logf("%s is created but not running", podID)
|
||||
continue
|
||||
}
|
||||
|
||||
currentImage := runKubectl("get", "pods", podId, "-o", "template", getImageTemplate)
|
||||
currentImage := runKubectl("get", "pods", podID, "-o", "template", getImageTemplate)
|
||||
if currentImage != image {
|
||||
By(fmt.Sprintf("%s is created but running wrong image; expected: %s, actual: %s", podId, image, currentImage))
|
||||
Logf("%s is created but running wrong image; expected: %s, actual: %s", podID, image, currentImage)
|
||||
continue
|
||||
}
|
||||
|
||||
hostIP := runKubectl("get", "pods", podId, "-o", "template", getHostIPTemplate)
|
||||
data, err := getData(hostIP)
|
||||
data, err := getData(podID)
|
||||
if err != nil {
|
||||
By(fmt.Sprintf("%s is running right image but fetching data failed: %v", podId, err))
|
||||
Logf("%s is running right image but fetching data failed: %v", podID, err)
|
||||
continue
|
||||
}
|
||||
if strings.Contains(data.image, image) {
|
||||
By(fmt.Sprintf("%s is running right image but fetched data has the wrong info: %s", podId, data))
|
||||
Logf("%s is running right image but fetched data has the wrong info: %s", podID, data)
|
||||
continue
|
||||
}
|
||||
|
||||
Logf("%s is verified up and running", podId)
|
||||
runningPods = append(runningPods, podId)
|
||||
Logf("%s is verified up and running", podID)
|
||||
runningPods = append(runningPods, podID)
|
||||
}
|
||||
if len(runningPods) == replicas {
|
||||
return
|
||||
@ -155,9 +173,8 @@ type updateDemoData struct {
|
||||
image string `json:"image"`
|
||||
}
|
||||
|
||||
func getData(hostIP string) (*updateDemoData, error) {
|
||||
addr := fmt.Sprintf("http://%s:8080/data.json", hostIP)
|
||||
resp, err := http.Get(fmt.Sprintf(addr))
|
||||
func getData(podID string) (*updateDemoData, error) {
|
||||
resp, err := http.Get(fmt.Sprintf("http://localhost:%d/api/v1beta1/proxy/pods/%s/data.json", kubectlProxyPort, podID))
|
||||
if err != nil || resp.StatusCode != 200 {
|
||||
return nil, err
|
||||
}
|
||||
@ -172,16 +189,17 @@ func getData(hostIP string) (*updateDemoData, error) {
|
||||
return &data, err
|
||||
}
|
||||
|
||||
func runKubectl(args ...string) string {
|
||||
func kubectlCmd(args ...string) *exec.Cmd {
|
||||
// TODO: use kubectl binary directly instead of shell wrapper
|
||||
path := filepath.Join(root, "cluster/kubectl.sh")
|
||||
cmdStr := path + " " + strings.Join(args, " ")
|
||||
Logf("Running '%v'", cmdStr)
|
||||
Logf("Running '%v'", path+" "+strings.Join(args, " "))
|
||||
return exec.Command(path, args...)
|
||||
}
|
||||
|
||||
cmd := exec.Command(path, args...)
|
||||
func runKubectl(args ...string) string {
|
||||
var stdout, stderr bytes.Buffer
|
||||
cmd.Stdout = &stdout
|
||||
cmd.Stderr = &stderr
|
||||
cmd := kubectlCmd(args...)
|
||||
cmd.Stdout, cmd.Stderr = &stdout, &stderr
|
||||
|
||||
if err := cmd.Run(); err != nil {
|
||||
Failf("Error running %v:\nCommand stdout:\n%v\nstderr:\n%v\n", cmd, cmd.Stdout, cmd.Stderr)
|
||||
|
Loading…
Reference in New Issue
Block a user